【发布时间】:2015-08-20 17:35:52
【问题描述】:
有时我会看到类似的 java 代码
Class<?>
我不明白它的正确含义。
如果我看到类似:
ComboBox<Order> box = new ComboBox<>();
那么很明显,该框只能包含 Order 类中的对象,但是 <?> 呢?它是等于还是完全不同的东西?
【问题讨论】:
有时我会看到类似的 java 代码
Class<?>
我不明白它的正确含义。
如果我看到类似:
ComboBox<Order> box = new ComboBox<>();
那么很明显,该框只能包含 Order 类中的对象,但是 <?> 呢?它是等于还是完全不同的东西?
【问题讨论】:
它被称为通配符,它只是意味着您不需要指定泛型类型。它有时很有用,但一般不应该使用。可以安全使用它的一种情况是使用类型绑定:
public void withWildCard(List<? extends Collection<Integer>> collections) {
...
}
public void withoutWildCard(List<Collection<Integer>> collections) {
...
}
List<Collection<Integer>> listOfCollections;
withWildcard(listOfCollections); // valid call
withoutWildcard(listOfCollections); // valid call
List<List<Integer>> listOfLists;
withWildcard(listOfLists); // valid call becase List is a subclass of Collection
withoutWildcard(listOfLists); // invalid call, does not compile because List does not match Collection
顺便说一句,你问题中的 sn-p 是错误的。应该是
ComboBox<Order> box = new ComboBox<>();
如果在声明端没有指定泛型类型,编译器将无法推断菱形运算符的类型 (<>)。
【讨论】:
List<Object> x = ...; List<?> y = x。实际上,我用List<?> 尝试了一些东西,但我无法向它添加任何东西,而它对于List<Object> 编译得很好。这让我觉得?仅应在类型有限制时使用(例如? super A,否则您对类型完全没有线索