내 질문은 위와 같습니다. 죄송합니다. 복제본 일 수도 있지만 <?>끝에 있는 예제를 찾을 수 없습니다 .
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<?>
Class유형 인 인수로 전달할 수 없습니다 Class<?>그래서, Class<?>모든 상황에 더 편리합니다.
이것은 <?>짐승입니다. 처음 볼 때 모든 자바 유형에<?> 대한 와일드 카드 이기 때문에 혼란과 오류가 종종 발생 합니다 . .. 사실이 아닙니다. <?>이다 미지의 종류 , 약간의 불쾌한 차이.
와 함께 사용할 때 문제가되지 않습니다 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 <?>의 장점은 우연히 또는 무지로 비 특정 클래스 참조를 사용하지 않는다는 것입니다. 비 특정 버전을 선택했습니다.