<T>
, <T>
및 <?>
은 완전히 다릅니다.
class X<T>
는 T
라는 이름의 형식 매개 변수 (자리)와 제네릭 클래스를 선언합니다. 해당 클래스에서 T
은 유효한 유형입니다.
X<T> something
은 변수 또는 필드 선언입니다. 유형이 generic 인 변수를 선언하고 은을 generic 매개 변수의 값으로 지정합니다.
X<?> something
도 변수 또는 필드 선언입니다. 유형이 generic 인 변수를 선언하지만 generic 매개 변수의 값은 지정하지 않습니다. 당신이 제네릭 클래스를 만들 때
, 당신은 선택적으로 사람들이 그 클래스의 인스턴스 (변수)를 선언 할 때 허용되는 유형을 지정하여 제네릭 매개 변수 제약 조건을 추가 할 수 있습니다.
따라서 class X<T extends SomeClass>
은 덜 유연한 유형 매개 변수로 일반 클래스를 만듭니다. 당신이 제네릭 클래스를 사용하는 경우 (이미 실제 값을 지정하고 이후)
(예를 들어, private Collection<String> myStrings
), 당신은 분명히 일반 매개 변수의 값에 제약을 지정할 수 없습니다.
따라서 private Collection<String extends Comparable> myStrings
은 의미가 없습니다.
와일드 카드 (또는 언 바운드) 매개 변수 (예를 들어, private Collection<?> myThingies
)과 제네릭 클래스를 사용
, 선택적 매개 변수가있을 수 있습니다 무엇이든에 제약을 지정할 수 있습니다. 이를 통해 일반 매개 변수의 (알 수없는) 값에 대한 사항을 추측 할 수 있습니다.
따라서 private Collection<? extends Runnable> myRunners
은 형식이 Runnable
을 구현한다는 것을 보장하는 알 수없는 형식의 모음입니다. 따라서 컬렉션에있는 항목에 .run()
으로 전화 할 수 있습니다.
그러나 콜렉션이 실제로 보유해야하는 유형을 알 수 없으므로 콜렉션에 아무 것도 넣을 수 없습니다.
'T data'는 첫 번째 코드 블록에서 의미가 없으므로 컴파일하지 않아야합니다. –
투표를 간단히하지 마십시오! 투표 실패 이유를 설명하거나 차이점을 설명하십시오. – jagamot
나는 투표를하지 않았다. 하지만 더 중요한 것은 두 코드 블록을 컴파일하려고 했습니까? 그렇다면 결과를 알려주십시오. 그렇지 않은 경우 지체없이 수행해야합니다. –