Java Generics误解

Hob*_*ist 3 java generics

为什么泛型T不能用作classif 的返回类型T extends Class.

例:

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

    Optional<T> forIndex(int index) {
        return Optional.ofNullable(array[index]);
    }
}
Run Code Online (Sandbox Code Playgroud)

T需要延长Bar哪个意味着T永远不会有铸造问题,或者我是否误解了这个?有人可以详细说明.

Tur*_*g85 5

你得到了错误的方法.每个T都是一个Bar,但不是每个Bar都是一个T.T比较专业Bar(每个dachshound是一只狗,但不是每条狗都是dachshound).这意味着,return Optional.ofNullable(array[index]);尝试匹配Bara T,这是不可能的.

你可以做的只是使方法通用:

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

    Optional<? super Bar> forIndex(int index) {
        return Optional.ofNullable(array[index]);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能希望查看Oracle关于通配符的教程以及PECS(生产者extends- 消费者super)助记符