2010-02-25 58 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