[英]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
引起的。 因此,該類型被“原始”使用。 要解決此問題,您有三個選擇。 您可以:
使您的整個班級通用
public class MyClass<T extends Comparable<T>> { private List<T> input; public MyClass(List<T> input) { this.input = input; } }
要么
使用通配符
private List<? extends Comparable<T>> input;
要么
重新考慮您的策略
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.