[英]Clarification about wildcards (Generics) in Java
我最近开始阅读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
命名类型。
在通用代码中,称为通配符的问号(?)表示未知类型。 通配符可以在多种情况下使用:作为参数,字段或局部变量的类型; 有时作为返回类型(尽管更具体的做法是更好的编程习惯)。 通配符从不用作泛型方法调用,泛型类实例创建或超类型的类型参数。
类型T是已定义类型或已知类型
希望这可以帮助
? extends some class or T extends some_class
表示some_class
本身或其任何子级,以及将与some_class实例一起使用的任何对象。
按照惯例,T表示类型,而T表示类型?
是未知类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.