我最近开始阅读 Core Java。但是我很难理解通配符的概念。
具体来说,我对以下内容之间的区别感到困惑:
public class A<T extends {some_class}> {/*...*/}
和
public class A<? extends {some_class}> {/*...*/}
如果有的话,谁能帮我理解其中的区别?
不同之处在于您不能在?
其他地方使用,而您可以使用T
. 例如:
public class Foo<T extends Number> {
T value; // you can declare fields of type T here
int foo() {
// Since you said T extends Number, you can call methods of Number on value
return value.intValue();
}
}
那你为什么要使用?
呢?如果你不需要类型。以我能想到的任何方式在类定义中使用它都是没有意义的。但是你可以用这样的方法来使用它:
int getListSize(List<?> list) {
return list.size();
}
您对整个类更感兴趣并且它具有不涉及参数化类型的方法的任何类型的方法都可以在这里使用。 Class.getName()
是另一个例子。
它们是相同的,除了通配符不能在类的代码中引用类型。使用T
名称类型。
在通用代码中,称为通配符的问号 (?) 表示未知类型。通配符可用于多种情况:作为参数、字段或局部变量的类型;有时作为返回类型(尽管更具体的是更好的编程实践)。通配符永远不会用作泛型方法调用、泛型类实例创建或超类型的类型参数。
Type T 是定义类型或已知类型
希望这可以帮助
? extends some class or T extends some_class
表示 some_class
它自己或它的任何孩子以及任何可以与 instanceof some_class 一起使用的东西。
根据约定, T 是一种类型,并且?
是未知类型。