Programing

Java 제네릭 : 여러 제네릭 매개 변수?

lottogame 2020. 11. 27. 07:40
반응형

Java 제네릭 : 여러 제네릭 매개 변수?


다음과 같이 여러 제네릭 유형을 허용하는 함수를 작성할 수 있는지 궁금합니다.

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);

작동할까요? 각 매개 변수의 제네릭은 각 매개 변수가 제네릭과 동일한 유형 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패키지 에있는 컬렉션 클래스의 일부 메서드 서명을 살펴볼 수 있습니다 . Generics는 특히 와일드 카드 ( ? extends? super)를 고려할 때 실제로 다소 복잡한 주제 입니다. 예를 들어, Set<Number>매개 변수로를 사용할 수있는 메서드 Set<Integer>. 이 경우 다음과 같은 서명이 표시됩니다.

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

주제에 대해 살펴볼 질문이 이미 많이 있습니다!

int원하는 경우 할 수 있지만 함수에서 를 반환하는 지점이 무엇인지 확실하지 않습니다 !


형식 또는 메서드에 여러 형식 변수를 선언 할 수 있습니다. 예를 들어, 메소드에 유형 매개 변수를 사용합니다.

<P, Q> int f(Set<P>, Set<Q>) {
  return 0;
}

또한 제네릭을 상속 할 수 있습니다. :)

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

다음 접근 방식 중 하나를 따를 수 있습니다.

1) 기본, 단일 유형 :

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

    for(int i=0; i<list.size(); i++){
        list.set(i, val);
    }

}

2) 여러 유형 :

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

    return val1+" "+val2;

}

3) 아래는 'T3가 함수 선언 부분에서 사용되는 제네릭 타입 목록에 포함되어 있지 않기 때문에 컴파일러 오류를 발생시킵니다.

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

옳음 : 잘 컴파일 됨

public static <T1, T2, T3> 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 <T> and 
 then followed it by return type, method name, and its parameters.

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

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

    for(int i=0; i<list.size(); i++){
        list.set(i, val);
    }

}

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

    return val1+" "+val2;

}

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

    return 0;

}*/

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

    return null;

}

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

    List<String> 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

a와 b는 모두 동일한 유형의 집합이어야합니다. 하지만 글쓰기를 방해하는 것은 없습니다

myfunction(Set<X> a, Set<Y> b)

함수 정의에서 집합 a와 b를 동일한 유형으로 제한합니다. 당신은 또한 쓸 수 있습니다

public <X,Y> void myFunction(Set<X> s1, Set<Y> s2){...}

참고URL : https://stackoverflow.com/questions/1759549/java-generics-multiple-generic-parameters

반응형