有没有一种方法可以强制Arrays.asList的返回类型

53

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

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

1个回答

69

您的语法几乎正确;<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中,您仍然可以提供明确的类型参数,但它是可选的。


哇,从未听说过这个。 - Pieter De Bie
在Java 8中有一些情况需要提供参数。我在做类似MyClass.<Derived> builder().someMethodWithGenericSignature(derived)的事情时遇到过这种情况。 - Troy Daniels
1
一个烦人的提示:确保你导入了正确的“Arrays”类。 - Daniel Jeney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接