いくつかのC#コードをJavaに移植しています。where構文、特にnew()に問題があります。whereがJavaのジェネリックに似ていることを理解しています。
Javaでnew()引数を複製するにはどうすればよいですか?
「new()制約により、コンパイラーは、提供されるすべての型引数にアクセス可能なパラメーターなし(またはデフォルト)のコンストラクターが必要であることを認識させます。」-MSDN
つまり:
public class BAR<T> : BAR
where T : FOO, new()
これが私がクレタスのソリューションをどのように実装したかです:
public class BAR<T extends FOO> extends ABSTRACTBAR {
public BAR(T t) throws InstantiationException, IllegalAccessException{
t.getClass().newInstance();
this.value = t;
}
}
ジェネリックはC#とJavaの間で根本的に異なるため、Javaでそれを複製することはできません。Javaは型消去を使用するため、ジェネリック型引数は(ほとんど)実行時に保持されません。ジェネリック型引数の要素を作成する場合は、クラスインスタンスを渡す必要があります。
public class Bar<T extends Foo> {
private final Class<T> clazz;
public class Bar(Class<T> clazz) {
this.clazz = clazz;
}
public T newInstance() {
return clazz.newInstance(); // this will throw checked exceptions
}
}
編集:ジェネリック型引数のランタイムタイプセーフティの問題をカバーするためだけに:型消去のために、Javaにはネイティブ型セーフティがないことは明らかです:ジェネリック型引数にはランタイム型がありません。ただし、解決策があります。あなたが使用するCollections.checkedList()
:
List<String> list = Collections.checkedList(new ArrayList<String>(),
String.class);
このコレクションは、でないものを挿入しようとすると例外をスローするようになりましたString
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加