8

Java のジェネリックスでの型消去について Herbert Schilds を読んでいます。おそらく、クラスで javap を実行すると、タイプ消去後のパブリック、パッケージ保護、および保護されたフィールドとメソッドに関するバイトコード情報が得られるはずです。ただし、次のクラスを作成しました。

    class Ambiguity<T, V extends String>{
    T ob1;
    V ob2;

    void set(T o){
        ob1 = o;
    }

    void set(V o){
        ob2 = o;
    }
}

生成されたクラスファイルでjavapを実行し、次の出力を得ました

「Test.java」からコンパイル

class Ambiguity<T, V extends java.lang.String> {
  T ob1;
  V ob2;
  Ambiguity();
  void set(T);
  void set(V);
}

私が読んだ内容に基づいて、このような出力を期待していました。

Compiled from "Test.java"
class Ambiguity<java.lang.Object, java.lang.String> {
  java.lang.Object ob1;
  java.lang.String ob2;
  Ambiguity();
  void set(java.lang.Object);
  void set(java.lang.String);
}

ここで何か不足していますか?上記の方法でメソッドをオーバーロードすることは良い習慣ではないことを理解していることを付け加えておきます。このあいまいさの下で javap の結果を見ることに興味を持っていました。

編集:これは、javap の新しい修正の結果のようです。 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4870651

JDK 1.6 から javap を実行すると、期待どおりの結果が得られます。最初に使用していたJDK 1.7 b30からjavapを実行すると、一般的な情報で結果が得られます。

4

1 に答える 1