尽管我在 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/