클래스를 클래스 <로 바꾸는 것이 좋습니까? 객체를 확장합니다> 경고를 피하기 위해?

StackOverflow https://stackoverflow.com/questions/370601

문제

내 코드의 무리의 장소에는 다음과 같은 것이 있습니다.

public Class mySpecialMethod() {
  return MySpecialClass.class;
}

경고를 유발합니다

클래스는 원시 유형입니다. 일반 유형 클래스에 대한 참조는 매개 변수화되어야합니다.

그러나 내가 교체하면

Class

~와 함께

Class<? extends Object>

경고가 사라집니다.

이 간단한 연습이 괜찮습니까, 아니면 나중에 문제를 일으킬 수 있습니까?

도움이 되었습니까?

해결책

클래스 객체가 표현 해야하는 일반적인 기본 클래스 나 인터페이스가없는 경우에만 해당되는 것은 올바른 일입니다.

또한 Class<?> 효과적으로 동일합니다 Class<? extends Object>.

다른 팁

예, 완전히 맞습니다.

유형을 지정해야합니다. 그리고 당신이 할 수 없다면, 당신은 와일드 카드를 지정해야합니다.

추가 읽기 : Java 언어 사양 : 매개 변수 유형

달성하고자하는 것에 따라 훨씬 더 정확할 수 있습니다.

public Class<MySpecialClass> mySpecialMethod() {
  return MySpecialClass.class;
}

실제로 Java 프로그래머는 아니지만 제네릭에 대한 좋은 논문을 읽으십시오.

예, 와일드 카드 또는 정확한 유형을 추가해야합니다 (Class<MySpecialClass>) 안전을 추가합니다. 그 이유는 수업이 일반적이기 때문입니다. 그래서, Class<Bar> 그리고 Class<Foo> 일반 유형 매개 변수를 삭제 한 후 동일합니다. 그들은 모두됩니다 Class, 소위 원시 유형. 그 소거는 컴파일 할 때 발생합니다. 컴파일러가 자동 캐스팅에 도움이되는 곳을 설명하기위한 몇 가지 예 (간단함을위한 예외 처리) :

class Mine { }

class Vara {
    public static void main(String... args) {
        { // works. translated to Mine m = (Mine) c.newInstance();
            Class<Mine> c = Mine.class;
            Mine m = c.newInstance();
        }
        { // doesn't work. need a cast: Mine m = (Mine) c.newInstance();
            Class c = Mine.class; // also Class<?> or Class<? extends Object>
            Object o = c.newInstance(); // but this works. pointing to a Mine
            Mine m = (Mine) c.newInstance(); // needs a manual cast
        }
    }
}

속담 Class<?> (그리고 동등한 Class<? extends Object>), 당신은 컴파일러에게 당신이 정말로 당신이 정말로 원한 수업을 원한다고 말합니다. T 객체이며 실수로 원시 유형을 사용하지 않았습니다. 그러나 편의 캐스트는 추가되지 않습니다. 제네릭이하는 모든 일은 자동 캐스트를 삽입하고 캐스트하는 것입니다. Object 대상 유형으로. 제네릭은 유형 U와 함께 사용하든, 구형 Java 버전과의 호환성 이유에 대해 런타임에서 유형 T와 함께 사용하든 동일합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top