Java Generics误解

时间:2015-06-06 19:47:15

标签: java generics

为什么通用T如果class不能用作T extends Class的返回类型。

示例:

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

    Optional<T> forIndex(int index) {
        return Optional.ofNullable(array[index]);
    }
}

T需要延长Bar这意味着T应该永远不会出现投射问题,或者我是否误解了这个问题?有人可以详细说明。

1 个答案:

答案 0 :(得分:5)

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

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

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

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

您可能希望查看Oracle's tutorial on Wildcards以及PECS (Producer extends - Consumer super) mnemonic