Java泛型的误解

标签 java generics

如果 T extends Class,为什么泛型 T 不能用作 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 不应该有转换问题,或者我误会了?有人可以详细说明吗。

最佳答案

你理解错了。每个 T 都是一个 Bar,但不是每个 Bar 都是一个 TTBar 更专业(每只 dachshound 都是一只狗,但并非每只狗都是 dachshound)。这意味着,return Optional.ofNullable(array[index]); 试图匹配 T 上的 Bar,这是不可能的。

你能做的就是只使方法通用:

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


关于Java泛型的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30686891/

相关文章:

java - 负数的立方根

java - ORA-00936 导致的 "Procedure created with compilation error"

java - 创建线程,做某事,杀死线程 - 全部在循环内 [JAVA]

Java:在给定类对象的情况下转换通用类

java - 如何回收 Java 中声明的 arraylist 的泛型类型?

java - 如何安全地返回通用对象

arrays - 创建一个扩展以在 Swift 中从数组中过滤 nils

java - AspectJ 错误 : Could not find or load main class aop.

java - Queue<E>接口(interface)的实现

C# 不寻常的继承语法 w/generics