这有什么区别?和 T 在类和方法签名中?

2022-09-02 19:40:40

为什么

public interface ArrayOfONEITEMInterface <T extends ONEITEMInterface>{
    public List<T> getONEITEM();
}

编译,但不是

public interface ArrayOfONEITEMInterface <? extends ONEITEMInterface>{
    public List<?> getONEITEM();
}

这有什么区别?和 T 在类和方法签名中?


答案 1

?是通配符,表示包含自身的任何子类。ONEITEMInterface

T是 本例中的具体实现。ONEITEMInterface

由于 是 通配符,因此类声明中的 u 和方法声明中没有关系,因此它不会编译。只是会编译虽然。???List<?> getONEITEM();


一种情况意味着整个类可以只处理每个实例种类型。Bar

interface Foo<T extends Bar> {
     List<T> get();
}

二种方案允许每个实例Bar

interface Foo {
     List<? extends Bar> get()
}

答案 2

T 是将由实现或实例化类提供的类型的占位符。

?是一个占位符,表示“我不知道也不关心泛型类型是什么”,通常在容器对象上执行的工作不需要知道类型时使用。

您不能在类/接口定义中使用“?”的原因是因为有值说定义占位符的名称(并且类型将在其他地方提供)。加上“?”是没有意义的。

此外,占位符不需要是T,它可以是任何标准的Java变量。按照惯例,它是一个大写字符,但不一定是。


推荐