2009-08-25 2 views
0

Java에서 매개 변수화 된 유형의 생성자에 대한 유형이 지정되지 않은 호출이 컴파일러 경고를 유발하는 이유는 무엇입니까? 정적 방법으로 비슷한 일을하는 것이 왜 괜찮습니까? 예를 들면 :Java에서 매개 변수화 된 유형의 생성자 유형 지정되지 않은 호출이 컴파일러 경고를 발생시키는 이유는 무엇입니까?

class Test<T> { 

    Test() {} 

    static <T> Test<T> create() { 
     return new Test<T>(); 
    } 

    @SuppressWarnings("unused") 
    public static void main(String[] args) { 
     Test<String> warning = new Test(); // compiler warning - why? 
     Test<String> okay = Test.create(); // no warning here - why? 
     Test<String> okay2 = Test.<String>create(); // why doesn't it need this? 
    } 

} 

답변

8

당신이 입력 변수에 지정되지 않은 인스턴스를 지정하기 때문에. 귀하의 3 가지 경우 :

  1. new Test<String>()이 맞을 수 있습니다.
  2. 자바 리턴 유형에 따라 자동 타입 추론을 지원하기 때문에, 그것은 여기 missign 일반적인 인수를 의미 할 수 즉, 및 방법 내에서, 당신은 new Test<T>()를 사용하여 (대신 단지 new Test())에 의해, 제네릭 타입의 EXPLICT를했습니다 .
  3. 때문에 2. ;-)
+0

나는이 관련 질문이 있습니다 으로 1 점까지)를 작업()가 안전하지 않은 다운 캐스트의 위험을 (함축 작업 ()에 해당하기 때문에 당신이 예에 번호를 추가 할 수 있다는 것입니다 태스크)? – Matthias

+1

@Matthias : 아니, 전적으로는 아니지만 - 모든 실제적인 의도와 목적 (생성 된 경고 제외)은 그렇습니다. 'Task '은 여전히 ​​명시 적으로 입력되지만, 위의 것은 아닙니다. 런타임시, 타입 삭제 때문에 어쨌든'Object'로 해석됩니다. –

1

자바는하지만 생성자에 (1 호선이 경고를 준다 이유 (2 개 호선 작품과 3 호선이 필요없는 이유입니다) 방법에 추론을 입력하지).

Java에서 생성자에 대한 유추를 입력하면 좋지만 Java 6에서는 그렇지 않습니다.

관련 문제