51

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

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

4

1 回答 1

67

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

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

爪哇 8

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

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

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

于 2013-04-03T22:32:36.490 回答