我有一个ArrayListJava的Collection类,如下所示:
ArrayList<String> animals = new ArrayList<String>();
animals.add("bat");
animals.add("owl");
animals.add("bat");
animals.add("bat");
Run Code Online (Sandbox Code Playgroud)
如您所见,它animals ArrayList由3个bat元素和一个owl元素组成.我想知道Collection框架中是否有任何API返回bat出现次数或是否有另一种方法来确定出现次数.
我发现Google的Collection Multiset确实有一个API,可以返回元素的总出现次数.但这只与JDK 1.5兼容.我们的产品目前是JDK 1.6,所以我不能使用它.
为什么这段代码不能编译(Parent是一个接口)?
List<? extends Parent> list = ...
Parent p = factory.get(); // returns concrete implementation
list.set(0, p); // fails here: set(int, ? extends Parent) cannot be applied to (int, Parent)
Run Code Online (Sandbox Code Playgroud) 是否可以说通用通配符类型不应该用在方法的返回参数中?
换句话说,声明一个如下所示的接口是有意义的:
interface Foo<T> {
Collection<? extends T> next();
}
Run Code Online (Sandbox Code Playgroud)
另外,可以说通用通配符类型仅在方法的参数声明中有意义吗?
大多数关于通配符的问题都想知道为什么编译器会拒绝一些合理的东西。我的问题是相反的。为什么下面的程序会被编译器接受?
void test(List<? extends Number> g1, List<? extends Number> g2)
{
g1 = g2;
}
Run Code Online (Sandbox Code Playgroud)
我试图从 Java 语言规范中解释这一点,但我还没有找到答案。我从 Java 泛型和通配符的各种描述中得到的印象是,通配符的每次使用都被捕获为一种全新的类型,但显然不是在这里。我没有发现允许此分配后出现任何令人讨厌的行为,但它似乎仍然是“错误的”。