簡體   English   中英

Java泛型分配全局變量

[英]Java generics to assign global variables

在此示例中,我得到警告“列表是原始類型”。 如何使用泛型正確滿足此警告? 我遇到了麻煩,因為我不知道如何像為構造函數簽名那樣為全局變量定義“ T”。

public class MyClass{

    private List input;

    public <T extends Comparable<T>> MyClass(List<T> input){
        this.input = input;
    }

}

您必須將類定義為參數化

public class MyClass<T extends Comparable<T>>{

    private List<T> input;

    public MyClass(List<T> input){
        this.input = input;
    }

}

“原始類型”是指沒有特定泛型參數類型的泛型類型。 在這種情況下,這是因為您在input的聲明中省略了泛型類型。 將聲明更改為:

private List<T> input;

應該解決錯誤。 此外,您的構造函數聲明不需要通用參數,可以縮短為:

public MyClass(List<T> input){
    this.input = input;
}

您可能需要執行以下操作:

public class MyClass<T> {
    private List<T> input;
}

如您所見,問題是由使用不帶通用參數的List成員變量input引起的。 因此,該類型被“原始”使用。 要解決此問題,您有三個選擇。 您可以:

  1. 使您的整個班級通用

     public class MyClass<T extends Comparable<T>> { private List<T> input; public MyClass(List<T> input) { this.input = input; } } 

要么

  1. 使用通配符

     private List<? extends Comparable<T>> input; 

要么

  1. 重新考慮您的策略

      public class MyClass { private List<Comparable<T>> input; public <T extends Comparable<T>> MyClass(List<T> input) { this.input = new LinkedList<>(); // Obv. there are better ways of copying a list... for (Comparable<T> obj : input) { this.input.add(obj); } } } 

我建議選擇1或3。

我相信您的問題是您說private List input; ,則無需為要查找的通用類型設置任何參數。 您可以通過說private List<T> input;來解決它private List<T> input;

您可以使該類通用。

public class MyClass<T extends Comparable<T>> {

    private final List<T> input;

    public MyClass(Collection<? extends T> input){
        this.input = new ArrayList<T>(input);
    }
}

我還更改了this.input = input以代替復制input 這確實非常重要,因為否則任何引用input都可以通過修改input來修改您的類。 通過允許T的任何子類型的任何Collection ,我還使您的構造函數更加靈活。

暫無
暫無

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

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