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)
上記の署名では、型として
S
と
T
を署名自体に含んでいます。したがって、これらは関数を含むクラスやインターフェイスに関連する任意の一般的な型とは異なり、独立しています。
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
を関数から返す意味がよくわかりません。
関連
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
swagger2 モデルが表示されない モデルが見つからない @ApiModel アノテーションが表示されない問題
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] Javaはパラメータのデフォルト値をサポートしていますか?
-
[解決済み] Javaで汎用配列を作成する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
SpringBoot 起動エラー java.nio.charset.MalformedInputException: 入力長 = 2 解決
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
アクセス制限の解決方法: ---- in Java
-
[解決済み】C#やJavaのGenericsと...C++のTemplatesの違いは?[終了しました]
-
[解決済み] Javaジェネリックス (ワイルドカード)