9

Java は通常、どのオーバーロードされたメソッドが正しいかを選択するときに、一般的なメソッドよりも通常のメソッドを優先します。これにより、次のsscceが生成される可能性があります。

public class GenericsTest {
    public static void main(String[] args) {
        myMethod(Integer.class, 10);
        myMethod(String.class, "overloaded method");
    }

    public static <T> void myMethod(Class<T> klass, T foo) {
        System.out.println("hello world");
    }

    public static <T> void myMethod(Class<T> klass, String bar) {
        System.out.println(bar);
    }
}

出力:

hello world
overloaded method

Java に Generic バージョンを強制的に使用させる方法はありますか?

4

4 に答える 4

3

いいえ、より具体的なオーバーロードを削除または非表示にするだけではありません。ただし、動作が異なる場合は、単に異なる名前にする必要があります。そして、それらが同じように動作する場合、どちらの方法でも問題ありません。

于 2013-06-19T13:12:30.530 に答える
1

Java に Generic バージョンを強制的に使用させる方法はありますか?

2 番目のメソッドのシグネチャを削除、名前変更、またはその他の方法で変更しないわけではありません。(本当にハックしたい場合は、これを行わないでください。リフレクションを使用してメソッドを呼び出します。) これは、Java のオーバーロード解決手順が、可能な限り最も具体的なメソッドを選択しようとするためです。

15.12.2.5. 最も具体的な方法の選択

複数のメンバー メソッドがアクセス可能で、メソッド呼び出しに適用できる場合は、ランタイム メソッド ディスパッチの記述子を提供するために 1 つを選択する必要があります。Java プログラミング言語では、最も具体的な方法が選択されるという規則が使用されます。

非公式の直感は、最初のメソッドによって処理された呼び出しが、コンパイル時の型エラーなしで別のメソッドに渡される場合、あるメソッドが別のメソッドよりも具体的であるということです。

于 2013-06-19T13:11:22.120 に答える
1

私が見た 1 つのアプローチは、使用頻度の低いメソッドにダミー パラメータを追加することです。

public static <T> void myMethod(Class<T> klass, String bar, Void ignored) {
    System.out.println(bar);
}

のように呼ぶ

myMethod(String.class, "overloaded method", null);

それ以外の場合

myMethod(String.class, "overloaded method");

ジェネリック メソッドを呼び出します。

于 2013-06-19T13:11:08.323 に答える
1

ジェネリック メソッドを使用すると、型パラメーターを使用して、メソッドへの 1 つまたは複数の引数の型とその戻り値の型の間の依存関係を表現できます。そのような依存関係がない場合は、ジェネリック メソッドを使用しないでください。

ここから)

于 2013-06-19T13:13:56.973 に答える