我有一个返回基类集合的方法:
import java.util.*;
class Base { }
class Derived extends Base { }
Collection<Base> getCollection()
{
return Arrays.asList(new Derived(),
new Derived());
}
这无法编译,因为Arrays.asList
(List<Derived>
)的返回类型与方法的返回类型(Collection<Base>
)不匹配。我明白为什么会发生这种情况:由于泛型类型不同,这两个类与继承无关。
有许多方法可以修复编译器错误,将方法的返回类型更改为不使用Arrays.asList将其中一个派生对象强制转换为Base。
有没有办法告诉编译器在解析Arrays.asList调用的泛型类型时使用不同但兼容的类型? (我一直在尝试使用这种模式并遇到这个问题,所以如果有办法让它工作,我想知道它。)
我认为你可以做类似
的事情Collection<Base> getCollection()
{
return Arrays.asList<Base>(new Derived(),
new Derived());
}
当我尝试编译它(java 6)时,编译器抱怨它在逗号处期望')'。
答案 0 :(得分:52)
你的语法几乎是正确的; <Base>
位于方法名称之前:
return Arrays.<Base>asList(new Derived(),
new Derived());
Java 8
对于Java 8,使用其improved target type inference,不需要显式类型参数。由于方法的返回类型为Collection<Base>
,因此类型参数将推断为Base
。
return Arrays.asList(new Derived(),
new Derived());
Java 7及更低版本仍然需要显式类型参数。您仍然可以在Java 8中提供显式类型参数;它是可选的。