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

Tro*_*els 41 java generics

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

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中提供显式类型参数; 这是可选的.