2013-08-16 21 views
0

我想寫一個名爲Number類,它需要一個泛型參數一個簡單的程序列表。 我在這裏的想法是我想將這些Number存儲在List中,這樣我就可以遍歷它並找到總和。使用泛型來實現這需要int和double和收益總和的Java

我的列表是[2,3,4,4,5]類型。這是int,double的混合體。我目前的代碼是低於 import java.util。*;

class Number<T> { 
    T n; 
    Number(T n) { 
     this.n=n; 
    } 
    public T getnumber(){ 
     return n; 
    } 

    public String toString() { 
     return n.toString(); 
    } 
} 

public class GenericsWildcards { 

    public static void main(String[] args) { 
     Number num1=new Number(5); 
     Number num2= new Number(5.4); 
     Number num3=new Number(1.2); 
     List<Number> list=new ArrayList<Number>(); 
     list.add(num1); 
     list.add(num2); 
     list.add(num3); 
     System.out.println(list);//prints correctly 
     double sum=0; 
     for (Number i : list){ 
      sum+=i.getnumber();//compile error here 
     } 
     System.out.println("sum is "+ sum); 
     } 

    } 

的系統輸出打印正確的名單,但我無法getnumber,因爲它是Object類型的回報。我試着把它加倍,sum+=(Double)i.getnumber();但仍然沒有幫助。 我該如何解決這個問題?非常感謝任何改進更好實施的想法。 謝謝

+0

爲什麼不實例化一個'List '? –

+0

在JDK中創建與類相同名稱的類通常是一個令人困惑的想法。 –

回答

1

你不需要創建自己的數類來實現這一點。您可以使用自動裝箱的一些幫助來使用Number庫的Java庫類來完成此操作。

 public static void main(String[] args) { 
      List<Number> list = new ArrayList<Number>(); 
      list.add(5); 
      list.add(5.4); 
      list.add(1.2); 

      System.out.println(list); 

      double sum = 0; 
      for(Number i : list){ 
       sum += i.doubleValue(); 
      } 

      System.out.println("sum is " + sum); 
     } 

我用doubleValue()將數字相加,同時保持小數信息。

1

你已經離開了泛型類型參數當您創建Number的實例,這就是爲什麼他們返回的對象。

您是否知道Java的API已經擁有了一批類,是所有引用類型的所有原始數字類型的超類(整數,浮點數,雙,龍等)?

0

您正在使用你的電話號碼爲原料類型(未指定T),因此所有的遺傳方式恢復對象,這就是爲什麼getNumber()返回Object爲您服務。

步驟1:扔掉你的電話號碼類,並使用Java的java.lang.Number代替。

第2步:使用自動裝箱的:

Number num1 = 5; // Integer 
Number num2 = 5.4; // Double 
Number num3 = 1.2; // Double 

步驟3:總和的數字doubleValue()在列表返回

0

你不想仿製藥,你可能希望子類化,即使那樣你也需要包裝總和操作。比如給你的代碼,你真正想要寫什麼是

Number<Integer> num1 = new Number<Integer>(5); 
Number<Double> num2 = new Number<Double>(5.4); 

注意,我們必須給類型爲通用的,也就是說num1Number<Integer>num2Number<Integer>,但是這會導致問題,如果我們想創建一個列表,因爲num1num2是不同的類型。

由於Java並不總是有generices,如列表,ArrayList的等類中使用的只取對象,因此,如果你沒有在類型默認爲對象傳遞。因此,你的代碼就相當於

Number<Object> num1 = new Number<Object>(5); 
Number<Object> num2 = new Number<Object>(5.4); 
... 
List<Number<Object>> list = new ArrayList<Number<Object>>(); 

實際上是不可能在Java中實現你所描述的,然而,這是可取的,因爲否則就不可能在編譯時知道是什麼類型的i.getnumber()等程序無法打字檢查(它應該如何知道你只添加了整數和雙打)。

P.S.你可能會尋找訪問者模式http://en.wikipedia.org/wiki/Visitor_pattern#Java_example