簡體   English   中英

泛型-不兼容的類型

[英]Generics - incompatible types

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  

您能否詳細說明此代碼不正確。

我希望新的Container將被泛化為與回調兼容的類型

首先,不能存在擴展String的類型,因為String是最終類。

其次,編譯器無法確定類型是否為? extends SomeType ? extends SomeType你用你的List是相同類型的T extends SomeType您使用的Container類,所以它產生一個錯誤。

您需要做的就是在方法簽名中聲明一個泛型類型,然后對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);

好吧,您正在使用泛型。 當您定義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) {

        }

    }
}

我希望這可以幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM