在Java中,Type Variables的边界只能出现在Type Variable声明中,对吧?

时间:2011-01-23 15:29:00

标签: java generics bounds type-parameter

类型变量的边界只能出现在类,接口,方法和构造函数的声明中吗?

或者我可以在将类型变量用作类型参数时绑定它吗?

修改 例如:

class MyClass<T extends Number> { // T is bounded by the interface Number
    // can a bounded Type Parameter appear anywhere else,
    // besides the Type parameter declaration?
}

3 个答案:

答案 0 :(得分:2)

考虑这种静态方法:

public static <T> List<T> filter(final List<T> orig, final Predicate<T> pred) {
  return new ArrayList<T>() {{
    for (T t : orig) if (pred.allow(t)) add(t);
  }};
}

“T”的“值”被每次调用“约束”。现在,它在调用方法时并没有真正的约束;它在编译时通过检查每个调用的静态细节来“绑定”,因为它出现在其他地方。

因此,如果在某个地方,我称之为:

final List<Integer> numbers = Whatever.filter(origList, new Predicate<Integer>() {
  public boolean allow(Integer i) {
    return i != null && i.intValue() > 0;
  }
});

然后“T”是“整数”。

答案 1 :(得分:2)

Java Language Specification似乎同意你的意见:

  

类型变量(§4.4)是一个   不合格的标识符。输入变量   由泛型类引入   声明(第8.1.2节)通用   接口声明(第9.1.2节)   泛型方法声明(§8.4.4)   并由通用构造函数   声明(§8.8.4)。

答案 2 :(得分:1)

是。类型Bounds应用于Type Variable的声明中。

换句话说 - 第一次出现Type Variable时。

public class MyClass<T extends MyItem> { // <- Type declaration

   private T item; // <-  Type usage

   public <K extends T> K getSubitem() {
   //      ^            ^ 
   //  declaration    usage   
     ...
     Arrays.<K>asList(); // <- Type Usage not a type declaration
   } 

}