是否可以覆盖重写方法的参数类型?

问题描述 投票:0回答:3

有人可以帮我处理下面的代码吗?

我有两个类Controller1Controller2实现接口控制器如下:

package com.controllers
public interface Controllers{
    public void method1(*****);
}
------------------------------
package com.controllers
public class Controller1{
    public void method1(com.model1.Module1 module);
}
------------------------------
package com.controllers
public class Controller2{
    public void method1(com.model2.Module1 module);
}
------------------------------

我有2个具有相同类的包(两个类具有相同的方法),如下所示

package com.model1
public class Module1{

}
------------------------
package com.model1
public class Module2{

}
-----------------------
package com.model2
public class Module1{

}
------------------------
package com.model2
public class Module2{

}

我正在使用Factory类在运行时获取Controller1Controller2的实例,因此继承类中method1的参数类型会有所不同。但我无法这样做,因为方法签名不能被覆盖。

有人可以建议我另类吗?谢谢...

java inheritance polymorphism override
3个回答
0
投票

我有2个包含相同类的包(两个类都有相同的方法)

为什么你没有为Module1,Module2创建公共父接口呢?

它看起来像

package com.model1
public class Module1 implements Model {

}
------------------------
package com.model1
public class Module2 implements Model{

}
-----------------------
package com.model2
public class Module1 implements Model{

}
------------------------
package com.model2
public class Module2 implements Model{

}

package com.controllers
public interface Controllers{
    public void method1(Model model);
}

但可能是我在你的问题中遗漏了一些东西


0
投票

无论如何,如果你不想使用Module1或Module2方法,你可以创建一个名为Method的空接口,这将是一个解决方案。如果你想使用他们的方法,你可以做同样的事情并添加类似的内容(阅读Java中的反射)

package com.controllers
public interface Controllers{
    public void method1(Model model) {
        if (model instanceof com.model1.Module1) {
            com.model1.Module1 module = (com.model1.Module1) model;
            ...
        } else if (model instanceof com.model2.Module1) {
            com.model2.Module1 module = (com.model2.Module1) model;
            ...
        }
    }
}

0
投票

为什么不在使用中添加一些泛型?

像这样:

public class Example {

    public static void main(String[] args) {

        Object module = new Random().nextBoolean()? new Module2(): new Module1();
        Factory factory = new Factory();
        Controllers produce1 = factory.produce(module.getClass());
        produce1.method1(module);

    }
}

class Factory {

    Controllers produce(Class<?> clz) {
        if (Module1.class.equals(clz)) return new Controller1();
        if (Module2.class.equals(clz)) return new Controller2();
        throw new IllegalArgumentException();
    }

}

interface Controllers<T> {
    void method1(T t);
}

class Controller1 implements Controllers<Module1> {

    public void method1(Module1 integer) {
        System.out.println("in 1!");
    }
}

class Controller2 implements Controllers<Module2> {

    public void method1(Module2 module) {
        System.out.println("in 2!");
    }
}


class Module1 {

}

class Module2 {

}
© www.soinside.com 2019 - 2024. All rights reserved.