2010-02-25 61 views
0

我們有一個C#代碼庫,我們必須在Java上進行部署。泛型,ToArray等

我們正在創建一個讀取C#並寫入Java的遷移引擎。

我們已經爲我們的代碼中使用的系統類創建了存根類,並正在實現它們。

當我在Java中做List<T>時,在執行ToArray時遇到了問題。

據我所知,由於Java和C#在泛型方面的主要差異,沒有辦法知道泛型類的類型,因此也沒有辦法創建類型數組。

這是最終的,或者任何你知道做一個泛型類ToArray沒有傳遞一個數組或一個類型作爲參數在這裏或在構造函數中的一些聰明的辦法。

+0

這是你的意思嗎? http:// stackoverflow。com/questions/529085/java-how-to-generic-array-creating – Karussell 2010-02-25 15:00:48

+0

可能最好將數組轉換爲'List's。 – 2010-02-25 16:12:48

回答

0

也許你應該看看Grasshopper並且不要重新創建車輪。它是Java字節碼編譯器的MSIL,它是一個成熟的產品。

2

Java中的列表有兩個toArray()按合同方法。

  • 無參數方法,它返回Object[]
  • 接受T[]類型的參數的方法。

在其ArrayList實現後者看起來像這樣(elementData是陣列背襯的列表):

public <T> T[] toArray(T[] a) { 
    if (a.length < size) { 
     // Make a new array of a's runtime type, but my contents: 
     return (T[]) Arrays.copyOf(elementData, size, a.getClass()); 
    } 
    System.arraycopy(elementData, 0, a, 0, size); 
    if (a.length > size) { 
     a[size] = null; 
    } 
    return a; 
} 

被傳遞在javadoc描述如下參數:

該列表中的元素將存儲在其中的數組,如果它足夠大;否則,將爲此分配一個相同運行時類型的新數組。

因此,如果您仍然想自己實現列表,請按照此方法 - 即事先創建適當類型的數組,然後將其傳遞給通用方法。

6

我們正在創建一個讀取c#並寫入Java的遷移引擎。

我不想把這隻猴子扳手扔進這個計劃中,但這聽起來像是一個真正可憐的想法。你將得到一個難以保持的單調混亂局面。這大致相當於通過谷歌翻譯運行戰爭與和平,並希望得到一個意味着完全相同的法語版本。

+0

+1 - 想象一下如果存在「收益率回報」或「.Where」或「.Select」等情況下他們必須產生的混亂。 – 2010-02-25 15:01:16

+0

我們只關注遷移我們自己的代碼,在特定情況下。沒有凌亂的產量等等...... 我們非常瞭解可讀性問題,並且着眼於解決它。 我們過去非常成功,並計劃在此做同樣的事情。 – Noam 2010-02-25 15:11:49

+1

@Noam:只要你意識到了這些限制,那麼okie就可以。儘管如此,我還是應該提出這個建議,以免人們認爲這是一個好主意。 – 2010-02-25 15:16:21

0

您可以查看內容並查找所有元素的最具體的超類。當然,這可能會變得比聲明的泛型更具體,它應該如何處理空列表是一個有趣的問題...

+0

有趣的想法,但不會在你指定的情況下工作。 – Noam 2010-02-25 15:12:41