0


1

ジェネリック、ToArrayなど

Javaにデプロイする必要があるC#コードベースがあります。

C#を読み取り、Javaを書き込む移行エンジンを作成しています。

コードで使用されるシステムのクラスのスタブクラスを作成し、それらを実装しています。

Javaで「List」を実行するようになったとき、「ToArray」を実装するときに問題が発生しました。

私が理解しているのは、ジェネリックに関してJavaとC#が大きく異なるため、ジェネリッククラスの型を知る方法がなく、したがって型付き配列を作成する方法がないことです。

これが最後か、配列または型をパラメーターとしてここまたはコンストラクターに渡さずに汎用クラスで「ToArray」を実行する賢い方法を知っている人はいますか?

4 Answer


6


_ C#を読み取り、Javaを書き込む移行エンジンを作成しています。 _

モンキーレンチをこの計画に入れるのは嫌ですが、これは本当に惨めなアイデアのように聞こえます。 あなたは、維持するのが難しいであろう単発的な混乱で終わります。 これは、Google翻訳を介して_戦争と平和_を実行し、まったく同じことを意味するフランス語版を取得することを期待するのとほぼ同じです。


2


Javaのリストには、契約により2つの `toArray()`メソッドがあります。

  • 引数なしのメソッド。`Object[] `を返します

  • `T []`型の引数を受け取るメソッド。

後者は、 ArrayList`実装では次のようになります( elementData`はリストを支える配列です)

public  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;
}

渡されるパラメーターは、http://java.sun.com/javase/6/docs/api/java/util/List.html#toArray%28T%5B%5D%29 [javadoc]で次のように説明されています。

_ このリストの要素が格納される配列(十分に大きい場合)。それ以外の場合は、同じランタイムタイプの新しい配列がこの目的のために割り当てられます。 _

したがって、リストを自分で実装したい場合は、このアプローチに従ってください。 事前に適切なタイプの配列を作成し、ジェネリックメソッドに渡します。


0


内容を調べて、すべての要素の中で最も具体的なスーパークラスを見つけることができます。 もちろん、それは宣言されたジェネリック型よりも具体的であることが判明する可能性があり、空のリストで何をすべきかは興味深い質問です…​


0


おそらく、http://dev.mainsoft.com/Default.aspx?tabid = 130 [Grasshopper]を見て、車輪を再発明しないでください。 これは、MSIL to Javaバイトコードコンパイラであり、成熟した製品です。