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


답변:


109

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


7
단순히 Class유형없이 사용하는 것 보다이 작업의 이점은 무엇입니까 ? 그들은 같은 것을 나타내는 것 같습니다.
ashes999

1
나는 일반의 요점은 클래스 유형을 미리 모른다는 것입니다. 그렇지 않으면 매개 변수에 특정 클래스 유형을 사용하는 함수를 정의하기 만하면됩니다. 이 물음표는 여전히 이해가되지 않습니다.
Brain2000

5
컴파일러에게 "이 클래스는 일반 클래스라는 것을 알고 있지만 실제 유형에 대해서는 신경 쓰지 않습니다. 구체적인 유형을 제공하는 대신 ?와일드 카드를 제공합니다 ."라는 다른 이점은 없습니다 . . 와일드 카드를 제공하지 않으면 컴파일러는 유형을 잊었거나 클래스가 일반인지 알지 못한다고 가정하고 경고합니다.
Kayaman

1
Kotlin과 동등한 기능Class<?>
JGuo

단순히 Class유형 인 인수로 전달할 수 없습니다 Class<?>그래서, Class<?>모든 상황에 더 편리합니다.
petertc

72

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

와 함께 사용할 때 문제가되지 않습니다 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") 만 저장할 수 있습니다. 실제 유형이 아닙니다.


8

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

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

Bruce Eckel, Java로 생각하기 :

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


1
인용문에 "Class <?>가 일반 Class보다 선호됩니다"및 "Class <?>의 이점"이 있습니다. 인용구가 꺾쇠 괄호와 일치하지 않는 것 같습니다.
Filip

1
탈출해야합니다. 지금 고정 : P
사미 Kuhmonen

5

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

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

5

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


3

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.