使用extends修正泛型的java语法

时间:2014-12-03 15:06:21

标签: java generics syntax

这是我挣扎的一段代码。

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?

2 个答案:

答案 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
   }
}