在回答问题Creating generic array in Java via unchecked type-cast时,newacct说
(在这个问题中,Bar的下限是Object。在Bar的下限是其他的情况下,在此讨论中将所有出现的Object替换为绑定的内容。)
这是newacct的代码:
class Foo<Bar> {
Bar[] bars = (Bar[])new Object[5];
public Bar get(int i) {
return bars[i];
}
public void set(int i, Bar x) {
bars[i] = x;
}
public Bar[] getArray() {
return bars;
}
}
我想知道Object
是Bar
的上限还是下限。我认为Foo<Bar>
是Foo<Bar extends Object>
的缩写,所以对象应该是Bar
的上限,我错了吗?
答案 0 :(得分:0)
给定类型变量声明<T extends TypeName>
,TypeName
是T
的上限。从技术上讲,我认为它只是绑定,因为上/下区别是only made for wildcards。另外,if no bound is specified, then Object
is assumed,所以你是对的Object
是示例中Bar
的范围。
我认为newacct只是在他们写下答案并且想要说'上限'而不是'下限'时才会出错。
编辑:此外,当谈到引用的Q&amp; A中的特定构造时,指出the erasure of a type variable is the erasure of its left-most bound是有用的,这是替换用于该元素类型的元素类型的重要性。使用绑定中使用的类型创建数组。例如,给定复杂类型变量声明<T extends Comparable<T> & Serializable>
,T
的擦除将为Comparable
,因此您将使用Comparable[]
或Comparable<?>[]
。
答案 1 :(得分:-1)
您也可以在泛型中定义下限。
class Foo<T extends Bar> {
T[] bars = (T[])new Object[5];
public T get(int i) {
return bars[i];
}
public void set(int i, Bar x) {
bars[i] = x;
}
public T[] getArray() {
return bars;
}
}
因此,您可以使用任何扩展Bar的类来创建Foo对象。
不,您不能使用对象类型的实例,下限是栏,上限是任何扩展Bar类的类。