내 질문은 위와 같습니다. 죄송합니다. 복제본 일 수도 있지만 <?>
끝에 있는 예제를 찾을 수 없습니다 .
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();
- 제네릭을 전혀 사용하지 않으면 최소한 경고가 표시됩니다 (제네릭을 사용하지 않으면 부작용을 감지하기 어려울 수 있으므로 일반적으로 사용하지 않는 것이 좋습니다)
