2016-09-07 2 views
0

이제 Generic에 대해 배우기 시작했습니다. 여기 전역 obj 값으로 ​​전역 obj 값을 설정하려고합니다. 형식 변환 오류가 발생했습니다.이 오류의 원인은 무엇입니까? 여기 일반 형식 변환 오류

class GenUpperBound<T> 
{ 
    T obj; 
    public <T extends Number> void set(T obj) 
    { 
     this.obj=obj; 
    } 

    public static void main(String...q) 
    { 
     GenUpperBound<Integer> w=new GenUpperBound<>(); 
     w.set(10); 
    } 
} 

당신은

class GenUpperBound<T extends Number> 

처럼 클래스를 선언해야 오류 ....

GenupperBound.java:6: error: incompatible types: T#1 cannot be converted to T#2 
     this.obj=obj; 
      ^
    where T#1,T#2 are type-variables: 
    T#1 extends Number declared in method <T#1>set(T#1) 
    T#2 extends Object declared in class GenUpperBound 
1 error 

답변

4

생성자 범위의 형식 매개 변수 <T extends Number>가죽 클래스 범위의 형식 매개 변수 <T>을. 그 두 T은 같은 유형을 나타내지 않습니다.

이것은 생성자의 인수가 클래스가 매개 변수화 된 형식과 다른 형식 일 수 있으므로 컴파일러가 코드를 컴파일하지 못하는 이유입니다. 예를 들어 :

new GenUpperBound<String>(new Integer(1)); 

의 차이는 U에 생성자 범위의 형식 매개 변수의 이름을 변경하는 경우 명확하게 볼 수 있습니다 :

class GenUpperBound<T> { 

    T obj; 

    public <U extends Number> void set(U obj) { 
     this.obj=obj; 
    } 

    ... 
} 

지금이 너무 잘 컴파일하지만 TU분명히은 다른 유형을 나타냅니다.


당신은이 문제를 해결할 수 :

class GenUpperBound<T extends Number> { 

    T obj; 

    public void set(T obj) { 
     this.obj=obj; 
    } 
... 
} 

지금 두 번째 T 형식 매개 변수가 아니라, 생성자가 사용하는 클래스 범위의 하나. 이 경우 new GenUpperBound<String>(new Integer(1));과 같은 명령문은 인수가 인스턴스가 매개 변수화 된 것과 같은 유형이 아니기 때문에 컴파일되지 않습니다.

0

입니다 그렇지 않으면 obj 예를 들어 String 형하고 있었다 당신이 할 수 있기 때문에 String에 Number를 할당하지 않습니다.

1

이 시도 :

class GenUpperBound<T extends Number> 
{ 
    T obj; 
    public void set(T obj) 
    { 
     this.obj=obj; 
    } 

    public static void main(String...q) 
    { 
     GenUpperBound<Integer> w=new GenUpperBound<>(); 
     w.set(10); 
    } 
}