有人可以帮我处理下面的代码吗?
我有两个类Controller1
和Controller2
实现接口控制器如下:
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类在运行时获取Controller1
或Controller2
的实例,因此继承类中method1
的参数类型会有所不同。但我无法这样做,因为方法签名不能被覆盖。
有人可以建议我另类吗?谢谢...
我有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);
}
但可能是我在你的问题中遗漏了一些东西
无论如何,如果你不想使用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;
...
}
}
}
为什么不在使用中添加一些泛型?
像这样:
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 {
}