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