[解決済み] なぜJavaにreified genericsがないことを気にしなければならないのか?
疑問点
これは、最近面接で、候補者がJava言語に追加してほしいものとして質問したときに出てきたものです。一般的に Java にない痛みとして認識されている 再定義されたジェネリックス がないことが苦痛であると一般に認識されていますが、それを押し付けられた候補者は、それがあれば実現できたであろうことの種類を実際に私に話すことができませんでした。
明らかに、Java では生の型が許可されているため (そして安全でないチェック)、ジェネリックスを破壊することが可能で、最終的には
List<Integer>
を含んでしまうことがあります。
String
s. これは明らかに型情報を再定義した場合に不可能となる可能性があります。
が、これ以上のものがあるはずです。
!
以下のような例を投稿していただけませんか?
本当にやりたいこと
の例を投稿してもらえますか?つまり、明らかにあなたは
List
の型を取得することはできますが、それを使って何をするのでしょうか?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
EDIT
: 回答が主に
Class
をパラメータとして渡す必要性についてです (例えば
EnumSet.noneOf(TimeUnit.class)
). 私はどちらかというと、次のようなものを探していました。
のようなものを探していました。
. 例えば
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?
どのように解決するのですか?
私が何度か遭遇したこの「必要性」は、結局のところ、次のような構成に集約されます。
public class Foo<T> {
private T t;
public Foo() {
this.t = new T(); // Help?
}
}
これは、C#では
T
には
デフォルト
のコンストラクタを使用します。によって実行時の型を取得することもできます。
typeof(T)
でコンストラクタを取得し
Type.GetConstructor()
.
一般的なJavaの解決策としては
Class<T>
を引数として渡すことです。
public class Foo<T> {
private T t;
public Foo(Class<T> cls) throws Exception {
this.t = cls.newInstance();
}
}
(必ずしもコンストラクタの引数として渡す必要はなく、メソッドの引数でもかまいません。
try-catch
は省略しています)
他のすべての一般的な型構成については、実際の型はリフレクションの少しの助けで簡単に解決することができます。以下のQ&Aは、使用例と可能性を示しています。
関連
-
アクセス制限です。タイプ 'JPEGCodec' は API ではない ☞My Blog Github ☜ ホームページを見る
-
Javaジェネリックを1つの記事で
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] なぜJavaにはtransientフィールドがあるのですか?
-
[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
-
[解決済み] List<Dog> は List<Animal> のサブクラスですか?Java のジェネリックはなぜ暗黙のうちに多相性にならないのですか?
-
[解決済み] 述語による最初の要素の検索
-
[解決済み] Java 8のインターフェイスメソッドで "final "が使えないのはなぜですか?
-
[解決済み] なぜJavaのenumリテラルは汎用型パラメータを持つことができないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
Eclipse の問題 アクセス制限。タイプ 'jfxrt' はAPI解決されていません。
-
java.sql.SQLException: executeQuery()でデータ操作文を発行できません。
-
Junitのユニットテストはjava.lang.Testを報告します。
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
java send https request prompt java.security.cert.について。
-
Junitのユニットテストエラー
-
コンストラクタDate()が未定義である問題
-
Java の double データ型における 0.0 と -0.0 の問題
-
[解決済み】java.util.Listのジェネリックタイプを取得する。