java - 为什么在 Java 中使用泛型时必须指定 <?>?

标签 java generics

尽管我在 C++ 和其他语言方面有丰富的经验,但我对 Java 还很陌生。所以模板/泛型不是我不知道的东西。

有件事让我困扰,那就是这个<?>有人告诉我,每当我使用某事物的通用实例时,当我事先不知道它将是什么特定类型时,我应该使用它:

喜欢:

List< MyGeneric >    foo; // bad
List< MyGeneric<?> > bar; // good

当使用第一个表达式时,IntelliJ 不会对我呕吐,而且我不明白为什么它应该这样做。我的同事表示第二个表达式好多了,但无法告诉我确切的原因。

我的意思是,除了第二个明确表明它是我们操纵的泛型这一事实之外,这两者之间到底有什么区别?

编译器在编译时当然知道它是一个泛型,所以猜测第二个表达式更好,因为它告诉程序员他正在操作一个通用的。

我说得对吗?

编辑:为了澄清起见,我显然使用了最严格的类型,例如 List<MyGeneric<Double>> ,每当我提前知道我要在那里存储什么时。我的问题是当我存储未知类型的泛型时。

最佳答案

每次每次?它并不总是适用,也不总是有意义。

让我们描述一下它实际上是什么:<?>unbound wildcard ,这立即意味着两件事:

  • MyGeneric是一个泛型类,但是
  • 不知道它持有什么类型(这可能并不重要)。

它比第一个表达式更可取,因为第一个表达式始终保证您将使用 raw type ,并且您确实不想使用原始类型。然而,如果认为每次都使用未绑定(bind)的通配符是理想的,那就太笼统了。

如果您确实知道或关心该类型,或者知道或关心其边界,请使用它。

关于java - 为什么在 Java 中使用泛型时必须指定 <?>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37385220/

相关文章:

java - 是否可以使用 SWT 显示默认的 Windows 进度对话框

java - JVM 在 hadoop reducer 上崩溃

java - 自定义 ListView Android 的 getView nullPointerException

java - Java运行时如何选择具体的类进行实例化?

Java 泛型 - 从 T 到 T 的类型不匹配

java - 在 Java 中为 android 生成相同的随机 BigInteger

java - 类似泛型的局部变量

java - 为什么我们不能扩展泛型类型?

typescript - 如何使用 Typescript 将类中的变量初始化为其通用值

java - 为什么 Java 不允许 Throwable 的泛型子类?