2013-04-03 59 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