2013-04-03 73 views
34

的返回类型我返回一个基类的集合的方法:有没有办法迫使Arrays.asList

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

+3

阵列。 asList – 2013-04-03 22:32:16

回答

47

你的语法几乎正确;该<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中提供显式类型参数;它是可选的。

+0

哇,从未听说过这个 – 2015-12-08 07:48:17

+0

在Java 8中有些情况下需要提供参数。我遇到过这样的事情,比如'MyClass。 builder()。someMethodWithGenericSignature(derived)''或类似的东西。 – 2018-02-13 20:15:22