ジェネリックを使用するコレクションオブジェクトのメンバ変数がある場合、型消去はどのように機能しますか?メンバ変数の型削除
public class Pojo {
private Map<String, String> stringStringMap;
...
}
タイプ情報が削除される他の状況とは異なり、この場合、タイプ情報は保持されますか?
ジェネリックを使用するコレクションオブジェクトのメンバ変数がある場合、型消去はどのように機能しますか?メンバ変数の型削除
public class Pojo {
private Map<String, String> stringStringMap;
...
}
タイプ情報が削除される他の状況とは異なり、この場合、タイプ情報は保持されますか?
タイプ情報はまだ消去されています。 実行時に。コンパイラは型を強制するので、プログラムで型を誤用することはできませんが、実行時には型を使用できなくなります。
Andy Turnerは、反射を使用してfieldの宣言されたタイプを取得することができます。あなたの例では、実行時にタイプはjava.util.Map<java.lang.String, java.lang.String>
となります。したがって、固定タイプの場合は、実行時に十分な情報が得られます。しかし、実際にジェネリックを使用している場合は、十分な情報が得られません。例:
class Pojo<T> {
Map<String, T> map;
}
この場合、リフレクションを使用して取得するランタイムタイプはjava.util.Map<java.lang.String, T>
です。これはあまり役に立ちません。
実行時に[汎用フィールド型](https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Field.html#getGenericType())を取得できます。 –
実行時に_declared_型を取得できますが、実際の型が宣言された型(sort-of-not-generic)でない限り、このメソッドを使用して_actual_型を取得することはできません。 – ngreen
他のタイプの消去と違いはありません。 – SLaks
あなたの質問が何であるか分かりません...なぜこれは違うと思いますか? –
私は、メソッドに引数としてマップを渡すと、それに関連付けられた型を推論する方法がないので、違いがあると思っていますが、メンバとしてマップを持つオブジェクトを渡すと、タイプ情報。 –