은 (명확성을 위해 하지 일반적인 클래스) 클래스 Foo
에 대해 다음 생성자를 고려일반 생성자의 사용 사례는 무엇입니까?
public <T> Foo(T obj) { }
이 그냥 일반 generic methods와 같은 생성자에 대한 올바른 구문입니다.
하지만이 구문의 사용법은 무엇입니까? 일반적으로 제네릭 메서드는 반환 형식에 대해 형식 안정성을 제공하며 컴파일러에서 형식 유추를 활용할 수 있습니다. 예를 들면 :
Pair<String, Integer> stringInt = Pair.of("asfd", 1234);
그러나 해당 유형의 매개 변수는 반환 형식에 영향을주지 않도록 생성자를 호출은 항상 그 선언 클래스의 인스턴스를 반환합니다. 위의 생성자는 그 erasure로 대체 할 수있다 : 물론 제네릭의
public Foo(Object obj) { }
는 반환 형식에 안전한 형태에 대한뿐만 아니라입니다. 생성자는 전달되는 인수 (들)의 유형을 제한 할 수 있습니다 그러나, 위의 추론은 여전히 제한된 유형의 매개 변수에 적용됩니다. 경계와
public <N extends Number> Foo(N number) { }
public Foo(Number number) { } //same thing
심지어 중첩 된 형식 매개 변수는 와일드 카드를 사용하여 처리됩니다
를public <N extends Number, L extends List<N>> Foo(L numList) { }
public Foo(List<? extends Number> numList) { } //same thing
그렇다면 일반적인 생성자를 사용하기위한 합법적 인 사용 사례는 무엇입니까?
아하, 매우 흥미 롭다! +1 –
+1, 이것은 훌륭한 예입니다. OP가 구체적으로 둘러싸인 유형이 일반 적이 지 않다고 말하기 때문에 약간은 속임수입니다. ('Stream'는 일반적인 것입니다.) –
@JohnFeminella - 나는 단지 나의 구체적인 예제 인'Foo'가 일반적인 것이 아니며 단지 혼란을 피하기위한 것입니다. 나는 대답에 대한 제한으로 그것을 의미하지는 않았다. –