[英]How to use different methods with generics
public class MyGenerics<T extends Number>{
List<T> = new ArrayList<T>();
public void addToList(){
for (ListIterator<T> it; it.hasNext(); ){
it.next();
it.add(number());
}
}
public T number(){
return (T) 5*Math.pi;
}
}
據我所知,沒有辦法告訴編譯器“我保證,由number()返回的所有內容都是某個擴展Number的對象,無論它是什么,都將被強制轉換為T類型,因為我正在強制轉換。
我是泛型新手,所以對您的幫助非常感謝。 我通過對類進行子類化解決了這個問題,但這半遺漏了泛型的觀點。
並且請注意,問題實際上並不是在列表中僅添加一個值。 問題是泛型邏輯。 (只是要清楚)
此問題將自動裝箱與泛型結合在一起。 那不會很漂亮。
5 * Math.PI
是原始的double
。 要轉換為任何類型的Number
對象,需要將其裝箱。 因此,編譯器需要知道裝箱操作的具體目標類型,但是由於使用的是泛型,因此缺少該目標類型。
如果該類未擴展,並且number()
始終返回double
(或Double
),請不要使用use泛型; 是明確的,並使用Double
代替T
如果要擴展該類,並且要重寫number()
方法,您仍然知道具體的類型。 在子類中使用匹配的類型參數聲明List
(您忽略的名稱)。
您給定的類定義告訴編譯器您將僅使用Number的一種特定子類類型填充列表。
如果要混合子類,則應按以下方式定義方法
public Number number(){
return 5*Math.PI;
}
並刪除整個類型變量,因為您的方法不能保證所有子代都為雙精度類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.