2016-07-13 72 views
-1
public class HelloWorld{ 

public static void main(String[] args) { 

    List<? extends Number> callback = new ArrayList<Long>(); 
    new Container<>().test(callback); 
} 

public static class Container<T extends Number> { 

    public void test(List<T> some) { 

    } 

} 

}泛型 - 不兼容的類型

這個代碼產生

HelloWorld.java:7: error: incompatible types: List<CAP#1> cannot be converted to List<Number>                                       
     new Container<>().test(callback);                                                    
          ^                                                      
    where CAP#1 is a fresh type-variable:                                                     
    CAP#1 extends Number from capture of ? extends Number 

你能詳細這段代碼不正確解釋。

我希望新的集裝箱將與同類型的回調

+3

有點毫無意義,因爲'String'是'final'類。 – Bohemian

+1

@Bohemian想象它是數字 – gstackoverflow

+0

在這種情況下,使用'Number',因爲在泛型中使用'Number'有正當的理由,但'String'不是很多。 – Makoto

回答

1

首先,不能有擴展StringString是最終的類類型兼容一概而論。

其次,編譯器不能確定,如果您使用您的List類型? extends SomeType是同一類型,您使用的ContainerT extends SomeType,所以它會產生一個錯誤。

你需要做的是要麼聲明在方法簽名的通用型,並使用該類型既ListContainer

public <T extends SomeClass> void example() { 
    List<T> callback = new ArrayList<>(); 
    new Container<T>().test(callback); 
} 

或者用非限定型申報名單:

List<SomeClass> callback = new ArrayList<>(); 
new Container<>().test(callback); 
+0

是的,這是真的+1 –

+0

我認爲你的意思是*用無界限類型*聲明列表,否? – Bohemian

+0

@Bohemian是的,我的壞 – explv

0

那麼,你正在使用泛型。當你定義Container時,它告訴Container默認構造函數必須支持一個String類型的實例。 這是一個正確的例子,String是Object的子類,所以我使用它。

public class HelloWorld{ 

    public static void main(String[] args) { 

     List<String> callback = new ArrayList<String>(); 
     new Container<String>().test(callback); 
    } 

    public static class Container<T extends Object> { 

     public void test(List<T> some) { 

     } 

    } 
} 

我希望這可以幫助你。