我試圖編寫一個具有泛型成員變量但不是泛型的類。具體而言,我想說的是,我有一個「實現與自身相媲美的某種類型」的值列表,以便我可以在該列表上調用排序......我希望這是有道理的。非泛型類中的泛型實例變量
我想要做的最終結果是創建一個類,以便我可以創建一個具有(任何給定類型)數組的類的實例,並讓它爲該列表生成一個字符串表示形式。在實際的代碼,我也通過在課堂上,我傳入類型:
String s = new MyClass(Integer.class, 1,2,3).asString();
assertEquals("1 or 2 or 3", s);
String s = new MyClass(String.class, "c", "b", "a").asString();
assertEquals("\"a\" or \"b\" or \"c\"", s);
本來我根本不想在課堂上通過,我只是想在價值傳遞和有代碼檢查結果數組以挑選值的類......但這也給我帶來麻煩。
以下是我的代碼,但我不能想出正確的魔力把該變量的類型。
public class MyClass {
// This doesn't work as T isn't defined
final List<T extends Comparable<? super T>> values;
public <T extends Comparable<? super T>> MyClass (T... values) {
this.values = new ArrayList<T>();
for(T item : values) {
this.values.add(item);
}
}
public <T extends Comparable<? super T>> List<T> getSortedLst() {
Collections.sort(this.values);
return this.values;
}
}
錯誤的變量聲明行:
Syntax error on token "extends", , expected
任何幫助將是非常讚賞。
編輯:更新的代碼使用列表而不是數組,因爲我不確定它可以用數組完成。
@馬克:一切從我讀過,我真想說:「T是一個類型,它是相當於自己」,而不是「T是一個類型,它是可比的。」話雖這麼說,下面的代碼無法正常工作或:
public class MyClass {
// This doesn't work
final List<? extends Comparable> values;
public <T extends Comparable> MyClass (T... values) {
this.values = new ArrayList<T>();
for(T item : values) {
this.values.add(item);
}
}
public <T extends Comparable> List<T> getSortedLst() {
Collections.sort(this.values);
return this.values;
}
}
上加行錯誤:
Type mismatch: cannot convert from List<capture#4-of ? extends Comparable> to List<T>
結論:
The method add(capture#2-of ? extends Comparable) in the type List<capture#2-of ? extends Comparable> is not applicable for the arguments (T)
的排序行錯誤
看來,它似乎是Java不能完全處理wh在我想要做的事情上。問題是因爲什麼,我想說的是:
我想是 可比對自己的項目清單,我 從創建傳入的 數據一次創建整個列表。
但是,Java看到我有這個列表,並且無法確定我的情況的所有信息在編譯時是否可用,因爲我可以嘗試稍後將其添加到列表中,並且由於類型擦除,它不能保證安全。如果不將通用類型應用到類中,那麼與Java通信的情況實際上是不可能的。
爲什麼不足以擁有一個實現Comparable的事物列表? – 2010-07-07 03:38:27
並不是說它解決了這個問題,但是可比較的東西並不意味着它與它本身相比。只是實施Comparable並不是說「與自己相比」。 – RHSeeger 2010-07-07 04:31:49
你可以用靜態方法來做到這一點。看到我的第二個答案。 – TofuBeer 2010-07-07 05:03:51