簡體   English   中英

如何對泛型使用不同的方法

[英]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.

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