在java泛型编程中,是没有通配符的参数类型的Object类上限或下限?

时间:2017-07-19 02:49:46

标签: java generics wildcard bounded-types

在回答问题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;
    }
}

我想知道ObjectBar的上限还是下限。我认为Foo<Bar>Foo<Bar extends Object>的缩写,所以对象应该是Bar的上限,我错了吗?

2 个答案:

答案 0 :(得分:0)

给定类型变量声明<T extends TypeName>TypeNameT的上限。从技术上讲,我认为它只是绑定,因为上/下区别是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类的类