2013-01-01 2 views
0

차이점은 무엇입니까?Java Generics - "T"및 "?"를 사용하는 경우

public class MyClass<? extends MySuperClass> { 

    private T data ; 
    private MyClass<? extends MySuperClass> parent ; 

} 

public class MyClass<T extends MySuperClass> { 

    private T data ; 
    // the below line - no compilation errors 
    private MyClass<? extends MySuperClass> parent ; 
    // the below line - compilation errors 
    private MyCLass<T extends MySuperClass> child ; 


} 

때 무엇을 사용 하는가?

+4

'T data'는 첫 번째 코드 블록에서 의미가 없으므로 컴파일하지 않아야합니다. –

+0

투표를 간단히하지 마십시오! 투표 실패 이유를 설명하거나 차이점을 설명하십시오. – jagamot

+0

나는 투표를하지 않았다. 하지만 더 중요한 것은 두 코드 블록을 컴파일하려고 했습니까? 그렇다면 결과를 알려주십시오. 그렇지 않은 경우 지체없이 수행해야합니다. –

답변

1

<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()으로 전화 할 수 있습니다.
그러나 콜렉션이 실제로 보유해야하는 유형을 알 수 없으므로 콜렉션에 아무 것도 넣을 수 없습니다.