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

2022-08-31 20:16:26

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

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

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

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

爪哇 8

对于具有改进的目标类型推理的 Java 8,显式类型参数不是必需的。因为该方法的返回类型是 ,所以 type 参数将被推断为 。Collection<Base>Base

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

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


答案 2

推荐