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);
주제에 대해 살펴볼 질문이 이미 많이 있습니다!
- Java Generics : List, List <Object>, List <?>
- Java Generics (와일드 카드)
- Generics in C # and Java ...와 Templates in C ++의 차이점은 무엇입니까?
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
'Programing' 카테고리의 다른 글
SQL Server 세션에서 자동 커밋을 어떻게 설정합니까? (0) | 2020.11.27 |
---|---|
컨트롤 색상을 어떻게 호출 할 수 있습니까? 기본 양식 색상을 의미합니까? (0) | 2020.11.27 |
단순 대리자 (대리자) 대 멀티 캐스트 대리자 (0) | 2020.11.27 |
jQuery의 'keypress'는 Chrome의 일부 키에서 작동하지 않습니다. (0) | 2020.11.27 |
UTF-8 읽기-BOM 마커 (0) | 2020.11.27 |