Java泛型理解错误

Java泛型理解错误,java,generics,Java,Generics,如果T扩展了类,为什么泛型T不能用作类的返回类型 例如: public class Foo<T extends Bar> { Bar[] array = new Bar[200]; Optional<T> forIndex(int index) { return Optional.ofNullable(array[index]); } } 公共类Foo{ 条形图[]数组=新条形图[200]; 可选forIndex(整数索引){

如果
T扩展了类
,为什么泛型
T
不能用作
的返回类型

例如:

public class Foo<T extends Bar> {
    Bar[] array = new Bar[200];

    Optional<T> forIndex(int index) {
        return Optional.ofNullable(array[index]);
    }
}
公共类Foo{
条形图[]数组=新条形图[200];
可选forIndex(整数索引){
返回可选的.ofNullable(数组[索引]);
}
}

T
需要扩展
Bar
,这意味着
T
不应该有铸造问题,还是我弄错了?有人能详细说明一下吗。

你搞错了。每个
T
都是
,但不是每个
都是
T
T
Bar
更专业(每只猎犬都是一只狗,但不是每只狗都是一只猎犬)。这意味着,
返回可选的.ofNullable(数组[index])
尝试匹配
T
上的
,这是不可能的

您可以做的是仅使方法通用:

public class Main {
    Bar[] array = new Bar[200];

    Optional<? super Bar> forIndex(int index) {
        return Optional.ofNullable(array[index]);
    }
}
公共类主{
条形图[]数组=新条形图[200];

OptionalJava泛型的擦除特性确保了数组和泛型不能很好地混合:数组是协变的,保留的,泛型是不变的把它擦掉。