내 질문은 위와 같습니다. 죄송합니다. 복제본 일 수도 있지만 <?>
끝에 있는 예제를 찾을 수 없습니다 .
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 <?>의 장점은 우연히 또는 무지로 비 특정 클래스 참조를 사용하지 않는다는 것입니다. 비 특정 버전을 선택했습니다.