我有这个(简化的)java接口
public interface MyInterface<T> {
public String run( T arg );
}
以及一些实现该接口的类,即
public final class SomeImplementation1 implements MyInterface<String> {
@Override
public String run( String arg) {
// do something with arg and return a string
}
}
和
public final class SomeImplementation2 implements MyInterface<CustomClass> {
@Override
public String run( CustomClass arg) {
// do something with arg and return a string
}
}
现在,我有一个用于所有这些实现的全局资源管理器,它将所有这些实现实例化在一个列表中以供以后使用。我想要实现的是这样的,这显然给了我一个错误
public final class MyInterfaceManager {
private List<MyInterface<?>> elements = new List<MyInterface<?>>();
public MyInterfaceManager() {
elements.put( new SomeImplementation1() );
elements.put( new SomeImplementation2() );
// more implementations added
}
// this is what I would like to achieve
public <T> void run( T arg ) {
for( MyInterface<?> element: elements ) {
String res = element.run( arg ); // ERROR
}
}
}
因为“无法通过方法调用转换将 arg 转换为 ? 的捕获#1”。一个可能的解决方案是instanceof
在循环内执行测试,并将元素转换为它的真实类型,以及参数,就像这样
public <T> void run( T arg ) {
for( MyInterface<T> element: elements ) {
if (element instanceof SomeImplementation2) {
String res = ((SomeImplementation2)element).run( (CustomClass)arg );
} else if // other tests here ...
}
}
但我不喜欢它,它一点也不优雅,它迫使我做很多事情instanceof
和演员。所以,我想知道是否有更好的方法来实现这一点。谢谢你的帮助 :)