有没有办法强制Arrays.asList的返回类型


问题内容

我有一个方法返回基类的集合:

import java.util.*;
class Base { }
class Derived extends Base { }

Collection<Base> getCollection()
{
    return Arrays.asList(new Derived(),
                         new Derived());
}

由于Arrays.asListList<Derived>)的返回类型与方法(Collection<Base>)的返回类型不匹配,因此无法编译。我理解为什么会这样:由于泛型类型不同,所以两个类之间没有继承关系。

有很多方法可以解决编译器错误,从将方法的返回类型更改为不使用Arrays.asList并将派生对象之一转换为Base。

当解析Arrays.asList调用的通用类型时,有没有办法告诉编译器使用其他但兼容的类型?(我一直在尝试使用这种模式并遇到这个问题,因此,如果有一种使其可行的方法,我想知道这一点。)

我以为你可以做类似的事情

Collection<Base> getCollection()
{
    return Arrays.asList<Base>(new Derived(),
                               new Derived());
}

当我尝试编译该代码(java 6)时,编译器抱怨它在逗号处期望’)’。


问题答案:

您的语法几乎是正确的;该<Base>方法的名称前有云:

return Arrays.<Base>asList(new Derived(),
                           new Derived());

Java 8

对于Java
8,由于其改进的目标类型推断,因此不需要显式类型参数。由于该方法的返回类型为Collection<Base>,因此将类型参数推断为Base

return Arrays.asList(new Derived(),
                     new Derived());

对于Java 7和更低版本,显式类型参数仍然是必需的。您仍然可以在Java 8中提供显式类型参数;这是可选的。