1. ホーム
  2. java

Javaジェネリックス:複数のジェネリックパラメータ?

2023-10-08 15:02:49

質問

以下のように、複数の汎用型を受け付ける関数を書くことは可能でしょうか。

public int void myfunction(Set<T> a, Set<T> b) {
    return 5;
}

Set<Integer> setA = new HashSet<Integer>();
Set<String> setB = new HashSet<String>();
int result = myfunction(setA, setB);

これでうまくいくのでしょうか?各パラメータのgenericは、各パラメータがgenericである同じ型Tを持たなければならないということでしょうか?

どのように解決するのですか?

はい - それは可能です(あなたのメソッドの署名ではありませんが)、はい、あなたの署名で、型は同じでなければなりません。

あなたが与えたシグネチャで T は一つの型に関連付けなければなりません(例えば String または Integer を含む) を呼び出し元で宣言することができます。しかし、複数の型パラメータを取るメソッドシグネチャを宣言することは可能です。

public <S, T> void func(Set<S> s, Set<T> t)

上記の署名では、型として ST を署名自体に含んでいます。したがって、これらは関数を含むクラスやインターフェイスに関連する任意の一般的な型とは異なり、独立しています。

public class MyClass<S, T> {
   public        void foo(Set<S> s, Set<T> t); //same type params as on class
   public <U, V> void bar(Set<U> s, Set<V> t); //type params independent of class
}

のコレクションクラスのメソッドシグネチャを見てみましょう。 java.util パッケージのコレクションクラスのメソッドシグネチャを見てみるといいでしょう。ジェネリックとは実に複雑なテーマで、特にワイルドカード ( ? extends? super ) が考慮されます。例えば、よくあるのは、メソッドが Set<Number> をパラメータとして受け取るメソッドが Set<Integer> . この場合、次のようなシグネチャが表示されます。

public void baz(Set<? extends T> s);

このテーマについては、すでにSOにたくさんの質問がありますので、ご覧になってみてください

を返す意味がよくわかりません。 int を関数から返す意味がよくわかりません。