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

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

次のように複数のジェネリック型を受け入れる関数を書くことができるかどうか疑問に思っていました:

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

Set setA = new HashSet();
Set setB = new HashSet();
int result = myfunction(setA, setB);

それはうまくいきますか? 各パラメーターのジェネリックは、各パラメーターがジェネリックである同じタイプTを持たなければならないことを意味しますか?

ありがとうございます。

  53  15


ベストアンサー

はい-可能です(ただし、メソッドシグネチャを使用することはできません)。

指定した署名では、「T」を単一のタイプに関連付ける必要があります(例: 呼び出しサイトでの String または` Integer`)。 ただし、複数の型パラメーターをとるメソッドシグネチャを宣言できます

public  void func(Set s, Set t)

上記の署名では、署名自体で型「S」と「T」を宣言していることに注意してください。 したがって、これらは、関数を含むクラスまたはインターフェイスに関連付けられたジェネリック型とは異なり、独立しています。

public class MyClass {
   public        void foo(Set s, Set t); //same type params as on class
   public  void bar(Set s, Set t); //type params independent of class
}

java.util`パッケージのコレクションクラスのメソッドシグネチャのいくつかを見てみたいと思うかもしれません。 ジェネリックは、特にワイルドカード( `? extends`と `? super)が考慮されます。 たとえば、パラメーターとして「Set」をとるメソッドが「Set」も受け入れる必要がある場合がよくあります。 その場合、次のような署名が表示されます。

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

あなたが主題を見るために、SOにはすでにたくさんの質問があります!

関数から `int`を返すポイントが何なのかわかりませんが、望むならそれを行うこともできます!

99


型またはメソッドで複数の型変数を宣言できます。 たとえば、メソッドで型パラメーターを使用する場合:

 int f(Set, Set) {
  return 0;
}

9


さらに、ジェネリックを継承できます:)

@SuppressWarnings("unchecked")
public , E extends Enum & SomethingAware> T getSomething(Class clazz) {
        return (T) somethingHolderMap.get(clazz);
    }

8


以下のいずれかの方法を使用できます。

{空} 1)基本的な単一タイプ:

//One type
public static  void fill(List  list, T val) {

    for(int i=0; i

{空} 2)複数のタイプ:

// multiple types as parameters
public static  String multipleTypeArgument(T1 val1, T2 val2) {

    return val1+" "+val2;

}

3)以下は、T3が関数宣言部で使用されるジェネリック型のリストにないため、コンパイラエラーが発生します。

//Raised compilation error
public static  T3 returnTypeGeneric(T1 val1, T2 val2) {
    return 0;
}

正しい:正常にコンパイルします

public static  T3 returnTypeGeneric(T1 val1, T2 val2) {
    return 0;
}

サンプルクラスコード:

package generics.basics;

import java.util.ArrayList;
import java.util.List;

public class GenericMethods {

/*
 Declare the generic type parameter T in this method.

 After the qualifiers public and static, you put  and
 then followed it by return type, method name, and its parameters.

 Observe : type of val is 'T' and not ''

 * */
//One type
public static  void fill(List  list, T val) {

    for(int i=0; i String multipleTypeArgument(T1 val1, T2 val2) {

    return val1+" "+val2;

}

/*// Q: To audience -> will this compile ?
 *
 * public static  T3 returnTypeGeneric(T1 val1, T2 val2) {

    return 0;

}*/

 public static  T3 returnTypeGeneric(T1 val1, T2 val2) {

    return null;

}

public static void main(String[] args) {
    List list = new ArrayList<>();
    list.add(10);
    list.add(20);
    System.out.println(list.toString());
    fill(list, 100);
    System.out.println(list.toString());

    List Strlist = new ArrayList<>();
    Strlist.add("Chirag");
    Strlist.add("Nayak");
    System.out.println(Strlist.toString());
    fill(Strlist, "GOOD BOY");
    System.out.println(Strlist.toString());


    System.out.println(multipleTypeArgument("Chirag", 100));
    System.out.println(multipleTypeArgument(100,"Nayak"));

}

}

出力例:

[10, 20]
[100, 100]
[Chirag, Nayak]
[GOOD BOY, GOOD BOY]
Chirag 100
100 Nayak

3


aとbは両方とも同じタイプのセットでなければなりません。 しかし、あなたが書くことを妨げるものは何もない

myfunction(Set a, Set b)

2


関数定義では、セットaとbを同じ型に制約しています。 また書くことができます

public  void myFunction(Set s1, Set s2){...}

2


タイトルとURLをコピーしました