2012-11-02 100 views
1

我想從單個方法返回2個不同類的類(List<double[]>List<Double[]),如下面的僞代碼所示。如何實現這一目標?將對象返回爲雙精度或雙精度的泛型方法

EDITED代碼和註釋:Eclipse甚至不允許編譯,因爲這是要求更改返回或數據類型。我知道YserieScaledCasted將不得不手動鑄造。

protected List<E[]> getYserieRescaledList(Class<E> c) { 

    if (Double[].class == c) 
     return this.YserieScaled; 
    else if (double[].class == c) 
     return this.YserieScaledCasted; 

} 

EDIT2:我找到了正確的我的問題非常簡單,只需描述here超載的方法。

+7

*「如何做到這一點?」*爲什麼要嘗試它? –

+1

'double.class'?你有沒有嘗試執行你的代碼? – Sujay

+0

@AndrewThompson:僅僅因爲我在我的類中使用了Double對象,但需要將原始double的數組列表返回給另一個類。 – hornetbzz

回答

2

你意識到你正在返回數組的列表,對不對? :-)

簡短的回答:

  • 即使你傳遞Class<E>,你不能使用instanceof運算符在泛型類型,所以你不能進行if語句上面勾畫

  • 以下是非法的,並在每個所述兩個的instanceof運營商不編譯:

class trash { 
    protected <T> List<T[]> getYserieRescaledList(Class<T> cl) { 
     List<T[]> result = null; 
     if (cl instanceof Class<Double>) { 
       result = ...; 
     } else if (cl instanceof Class<double>) { 
       result = ...; 
     } 
     return result; 
    } 
} 
  • 這樣做的原因是,泛型是編譯時只構建。所有實例化的泛型類都轉換爲非泛型類,並插入類型和進行類型轉換等。在運行時詢問泛型類是否被實例化爲特定類型是沒有意義的 - 泛型類已被交換爲非泛型類

  • 相反,刪除if語句並簡單地使用實例化類型聲明變量&數組,然後用你的算法來填充它們,並返回結果:

class treasure { 
    protected <T> List<T[]> getYserieRescaledList(Class<T> cl) { 
     List<T[]> result = null; 
     // apply general algorithm here to populate the array 
     // will work identically whether instantiated with Double or double 
     return result; 
    } 
} 

再回應:

泛型類應表示可以與各種特定的實例化類型一起應用的泛化處理的「模板邏輯」。

很好的例子是java集合,持久性查詢框架(如JPA Criteria API),用於不同類型投資的財務計算器,甚至是具有標準服務「容器」基礎架構邏輯的SOA服務模板。

在你的情況下,它可能是簡單的使用僞方法重載(即兩種方法有稍微不同的名稱):

protected List<Double[]> getYserieRescaledList() { 
    return this.Y; 
} 

protected List<double[]> getYserieRescaledList2() { 
    return this.YCasted; 
} 

甚至更​​好,只是堅持翻倍[]作爲唯一的案例。當您將值提取到其他變量/方法參數中時,編譯器會根據需要透明地將自動包名轉換從double轉換爲Double。

1

只需使用Double[].classdouble[].class。請注意,您不能將Double[]投射到double[],反之亦然,您必須手動將其複製。因此,通過擴展,你不能投List<Double[]>List<double[]>要麼。 編輯:雖然乍一看,這似乎可能是你正試圖糾正的限制。

1

這裏有一些有趣的事情發生。因此,您的List<double[]>是一個List<Array>對象,其中Array包含基元double s。

我敢說,仿製藥在這裏不是正確的解決方案。

我認爲你最好的選擇是使用Google Lists庫。

是這樣的:

protected List<Double[]> getYserieRescaledList() { 
    return this.YseriesScaled; 
} 

然後,無論你的來電可以getYseriesRescaledList()這樣做獲得List<double[]>

Lists.transform(getYseriesRescaledList(),toPrimitiveDouble());

這將構建一個List對象中的一行代碼,使用下面的功能(從谷歌番石榴):

private Function<Double[], double[]> toPrimitiveDouble(){ 
    return new Function<Double[], double[]>() { 
     @Override 
     public double[] apply(Double[] doubles) { 
      double[] doubleArray = new double[doubles.length]; 

      int i = 0; 
      for (Double doubleObject : doubles){ 
       doubleArray[i] = doubleObject.doubleValue(); 
       ++i; 
      } 

      return doubleArray; 
     } 
    }; 
}