我最近开始阅读Core Java。但我很难掌握通配符的概念。
具体来说,我对以下内容之间的区别感到困惑:
public class A<T extends {some_class}> {/*...*/}
和
public class A<? extends {some_class}> {/*...*/}
任何人都可以帮我理解差异吗?
答案 0 :(得分:1)
不同之处在于,您可以使用?
时无法在其他地方使用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()
是另一个例子。
答案 1 :(得分:0)
它们是相同的,除了使用通配符之外,您无法引用类的代码中的类型。使用T
命名类型。
答案 2 :(得分:0)
在通用代码中,称为通配符的问号(?)表示未知类型。通配符可用于各种情况:作为参数,字段或局部变量的类型;有时作为返回类型(虽然更好的编程实践更具体)。通配符从不用作泛型方法调用,泛型类实例创建或超类型的类型参数。
Type T是已定义的类型或已知类型
希望这有帮助
答案 3 :(得分:0)
? extends some class or T extends some_class
表示some_class
本身或其任何子项以及与some_class一起使用的任何内容。
根据约定,T表示类型,?
是未知类型。