关于Java中通配符(泛型)的澄清

时间:2013-07-09 04:56:00

标签: java generics

我最近开始阅读Core Java。但我很难掌握通配符的概念。

具体来说,我对以下内容之间的区别感到困惑:

public class A<T extends {some_class}> {/*...*/}

public class A<? extends {some_class}> {/*...*/}

任何人都可以帮我理解差异吗?

4 个答案:

答案 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表示类型,?是未知类型。