4

つまり、たとえばC#では、次のようなジェネリックメソッドを記述できます。

public static void Concatenate<T> (T arg1, T arg2) 
{
    Console.WriteLine(arg1.ToString() + arg2.ToString());
}

次に、これらのさまざまな方法でメソッドを呼び出すと、次のようになります。

Concatenate("one", "two"); // will work just fine, outputs "onetwo"
Concatenate(1, 2); // will also work great, outputs 12
Concatenate("one", 2) // will give a compiler error

あるいは、次のようにメソッドを呼び出すこともできますConcatenate<string>("one", "two");。文字列のみが入力されることを確認してください。

今、Javaでまったく同じことを試してみると

public static <T> void concatenate(T arg1, T arg2) {
    System.out.println(arg1.toString() + arg2.toString());
}

そして、c#の例とまったく同じ方法でメソッドを呼び出します。

concatenate("one", "two"); // will work just fine, outputs "onetwo"
concatenate(1, 2); // will also work great, outputs 12
concatenate("one", 2) // will work fine and outputs "one2"

私の知る限り、このようなメソッドを呼び出すことはできませconcatenate<String>("One", "Two");ん。エラーが発生します。

C#で見つけたそのような型安全性を追加する方法はありますか?

だから私はどちらかの場所にどんなタイプでも入れることができて警告を受け取るだけであるという危険を冒さない...

より良い例は、可変引数を使用することです

C#で私はします:

public static void QuickSort<T>(params T[] args) // same as (T... args) in java
{
    // code
}

そして、それを呼び出すと、たとえば次のようなことを行うことによって、1種類のパラメーターのみが取得されることを確認します。

QuickSort<int>(5, 9, 7, 3, 2, 5, 4, 1);

一方、Javaではこれを行うことができます:

quickSort(5, "nine", 7, 3, "two", 5, 4, 1);

そして、IDEから警告を受け取るだけですが、C#ではエラーが発生します

QuickSort<int>(args)だから私の質問は、Javaではなくc#、a-laのようにパラメータタイプを「ロック」できる方法はありますquickSort(args)か?

4

3 に答える 3

4

私の知る限り、このようなメソッドを呼び出すことはできませconcatenate<String>("One", "Two")ん。エラーが発生します。

実際には、構文だけが少し異なります。

public class Main {

    public static <T> void concatenate(T arg1, T arg2) {
        System.out.println(arg1.toString() + arg2.toString());
    }

    public static void main(String[] args) {
        Main.<String>concatenate("one", "two"); // will work just fine, outputs "onetwo"
        Main.<Integer>concatenate(1, 2); // will also work great, outputs 12
        Main.<String>concatenate("one", 2); // will fail at compile time
    }
}

concatenate()非メソッドの場合static、構文はになりますobj.<String>concatenate(...)

2番目の例について:

public class Main {

    public static <T> void quickSort(T... args) {
    }

    public static void main(String[] args) {
        quickSort(5, "nine", 7, 3, "two", 5, 4, 1);                // warning
        Main.<Integer>quickSort(5, "nine", 7, 3, "two", 5, 4, 1);  // error
    }
}

ここでMain.<Integer>quickSort(...)は、次のエラーで失敗します。

Main型のパラメーター化されたメソッドquickSort(Integer ...)は、引数(Integer、String、Integer、Integer、String、Integer、Integer、Integer)には適用できません。

于 2013-03-03T19:03:34.543 に答える
2

ジェネリックパラメーターを使用して明示的にすることができますが、構文は試したものとは異なります。

インスタンスメソッドの場合:

instance.<String>concatenate("a","b")

静的メソッドの場合:

MyClass.<String>concatenate("a","b")
于 2013-03-03T19:05:52.017 に答える
1

あなたが求めているものには「型安全性」はありません。Concatenate("one", 2)完全にタイプセーフです。型安全性の観点からそれを禁止する理由はありません。ジェネリックは、恣意的な制限を行うためのものではありません。

于 2013-03-03T21:31:55.713 に答える