类型变量的边界只能出现在类,接口,方法和构造函数的声明中吗?
或者我可以在将类型变量用作类型参数时绑定它吗?
修改 例如:
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?
}
答案 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
}
}