繁体   English   中英

Java中有关通配符(泛型)的说明

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM