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

时间:2013-04-03 22:28:49

标签: java generics

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

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)时,编译器抱怨它在逗号处期望')'。

1 个答案:

答案 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中提供显式类型参数;它是可选的。