8

Strings をコレクションとして扱うクラスがあります。これらは、クラスの 2 つのメソッドです。

@Override
public <B> IndexedSeq<B> map(final Function1<? super Character, B> function) {...}

public RichString map(final Function1<? super Character, Character> function) {...}

メソッドからの署名だけが私の質問に関連しています。現在、Eclipse は、2 つのメソッドの消去が同じであるという警告を発行します。しかし、それでもそれらを作成することはでき、期待どおりに機能します。Character を Character に変換する関数を指定すると、必要に応じて RichString が返されます。

私の質問は、実行時にジェネリック型に関する情報がなく、メソッドの戻り値がメソッド シグネチャの一部ではないため、なぜ機能するのかということです。2 つのメソッドを呼び出したときに、JVM はどのメソッドを呼び出すべきかをどのように知ることができますか?

編集:

消去後、2 つのメソッドには次の署名があると思います。

@Override
public IndexedSeq map(final Function1<Object, Object> function) {...}

public RichString map(final Function1<Object, Object> function) {...}

これにより、戻り値の型だけが異なります。

4

2 に答える 2

2

これがコンパイルされるべきではないことは正しいです。Java 6 には、次のようなコードが誤って受け入れられるバグがあります: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6182950

于 2013-05-08T00:17:20.050 に答える
1
  1. ランタイムは、クラス/メソッド シグネチャに関してはジェネリック型に関する多くの情報を持っていますが、オブジェクト インスタンスに関してはそうではありません。2 番目のオーバーロードのシグネチャ全体は、おそらくリフレクションによって取得できます。
  2. とにかく、メソッドのオーバーロードはコンパイル時に解決されるため、問題ではありません。あいまいさがそこで解決される可能性があります。たとえば、コンパイラが type のパラメーターに対して「より具体的な」2 番目のオーバーロードを考慮することによってFunction<Character, Character>です。
于 2013-05-07T12:09:09.260 に答える