这是我挣扎的一段代码。
public class Channel<T extends Something>{
public Channel(){}
public void method(T something){}
}
public class Manager{
private static ArrayList<Channel<? extends Something>> channels
= new ArrayList<Channel<? extends Something>>();
public static <T extends Something> void OtherMethod(T foo){
for(Channel<? extends Something> c : channels)
c.method(foo); // this does not work
}
}
不起作用的行给我编译错误:
The method method(capture#1-of ? extends Something) in the type Channel<capture#1-of ? extends Something> is not applicable for the arguments (T)
我不明白这个错误。如果我删除了Manager类中的所有泛型,它可以正常工作但输入不安全。 我该怎么做正确的Java?
答案 0 :(得分:1)
这本质上是不安全的。
如果您在列表中添加Channel<MyThing>
,然后使用OtherMethod()
致电YourThing
会怎样?
您应该使整个类具有通用性(并使成员非静态),并对通道和参数使用相同的T
。
答案 1 :(得分:1)
您需要方法public <T extends Something> void method(T foo)
public class Channel<T extends Something> {
public Channel() {
}
public <T extends Something> void method(T foo) {
}
}
public class Manager {
private static ArrayList<Channel<? extends Something>> channels = new ArrayList<Channel<? extends Something>>();
public static <T extends Something> void OtherMethod(T foo) {
for (Channel<? extends Something> c : channels)
c.method(foo); // this does not work
}
}