[java] Java에서 Class <?>는 무엇을 의미합니까?

내 질문은 위와 같습니다. 죄송합니다. 복제본 일 수도 있지만 <?>끝에 있는 예제를 찾을 수 없습니다 .

Class매개 변수로 사용하지 않는 이유는 무엇 입니까?



답변

Class는 매개 변수화 가능 클래스이므로 구문은 Class<T>where T형식입니다. 을 쓰면 어떤 유형이든 될 수 Class<?>있는 Class객체 ( ?와일드 카드)를 선언하게 됩니다. Class타입은 클래스에 대한 메타 정보를 포함하는 유형입니다.

이 방법을 Class<?>존중하고 ( Class매개 변수를 알고 있음 ) 매개 변수를 특정 형식으로 제한하지는 않지만 특정 형식을 지정하여 일반 형식을 참조하는 것이 좋습니다.

제네릭 및 와일드 카드에 대한 참조 : http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

Class객체 및 리플렉션 (자체 검사에 사용되는 Java 언어 기능)에 대한 참조 : https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html


답변

이것은 <?>짐승입니다. 처음 볼 때 모든 자바 유형에<?> 대한 와일드 카드 이기 때문에 혼란과 오류가 종종 발생 합니다 . .. 사실이 아닙니다. <?>이다 미지의 종류 , 약간의 불쾌한 차이.

와 함께 사용할 때 문제가되지 않습니다 Class. 두 줄 모두 작동하고 컴파일합니다.

Class anyType = String.class;
Class <?> theUnknownType = String.class;

그러나 컬렉션과 함께 사용하기 시작하면 이상한 컴파일 시간 오류가 나타납니다.

List<?> list = new ArrayList<Object>();  // ArrayList<?> is not allowed
list.add("a String");                    // doesn't compile ...

우리 List<?>는 컬렉션이 아니며 모든 유형의 객체에 적합합니다. 하나의 유형 (신비한 “unkown type”) 만 저장할 수 있습니다. 실제 유형이 아닙니다.


답변

이는 클래스 참조가 모든 클래스 객체에 대한 참조를 보유 할 수 있음을 의미합니다.

기본적으로 “클래스”와 동일하지만 제네릭에 대해 잊어 버리지 않은 코드를 읽는 다른 사람들을 보여주고 있습니다. 클래스 객체를 보유 할 수있는 참조 만 원합니다.

Bruce Eckel, Java로 생각하기 :

Java SE5에서 Class <?>는 일반 클래스보다 선호되지만 일반 클래스는 컴파일러 경고를 생성하지 않지만 일반 클래스보다 선호됩니다. Class <?>의 장점은 우연히 또는 무지로 비 특정 클래스 참조를 사용하지 않는다는 것입니다. 비 특정 버전을 선택했습니다.


답변

그것은의 제네릭 문자. 이는이 Class인스턴스가 나타내는 클래스 유형을 모르지만 여전히 일반 버전을 사용하고 있음을 의미합니다.

  • 수업을 알고 있다면을 사용 Class<Foo>합니다. 이렇게하면 캐스팅하지 않고 새 인스턴스를 만들 수 있습니다.Foo foo = clazz.newInstance();
  • 제네릭을 전혀 사용하지 않으면 최소한 경고가 표시됩니다 (제네릭을 사용하지 않으면 부작용을 감지하기 어려울 수 있으므로 일반적으로 사용하지 않는 것이 좋습니다)

답변

제네릭에서 알 수없는 형식은 와일드 카드 문자 “?”로 표시됩니다. 공식적인 예를 보려면 여기 를 읽으 십시오 .


답변

그것은 (알 수없는) 어떤 유형의 클래스를 의미합니다.

더 잘 이해하려면 Java 제네릭 자습서를 읽어야합니다.


답변