2011-12-26 3 views
1

다음 코드가 컴파일되지 않는 이유는 무엇입니까?일반 클래스의 컴파일 오류

class aa1 <String> { 
public void fun(){ 
String s = ""; // not compiling 
} 
} 
class aa2 <String> { 
String s = ""; // not compiling 
} 
class aa3 <String> { 
String s = (String)""; // compiling 
} 

일부 사람들에게이 말을 전하고 싶습니다. 감사합니다.

+1

몇 가지 힌트를 제공하는 컴파일러 오류 메시지가 표시되지 않습니까? –

답변

2

일반 매개 변수 "String"은이 경우 java.lang.String을 숨 깁니다.

클래스에서 문자열 s을 선언하고 해당 데이터 유형을 "java.lang.String"으로 지정하면 컴파일러에서 불평하지 않습니다.

public class aa<String> { 

    java.lang.String s = "" ; 

} 
0

일반적인 매개 변수 이름 (String)은 java.lang.String 유형을 숨 깁니다.

제네릭 매개 변수의 이름을 바꾸는 것이 좋습니다. 그런데 어떤 유형을 s으로 지정 하시겠습니까? java.lang.String 또는? 후자의 경우 컴파일러가 "" (유형이 java.lang.String)을 generic 매개 변수로 표시되는 잠재적으로 관련이없는 유형에 할당하는 방법은 무엇입니까?

0

예제에서 사용자는 String을 식별자로 선언하고 있습니다. 키워드 또는 유형 이름을 사용하면 안됩니다. (Generics Tutorial).

+0

하지만 3 학년 캐스팅으로 컴파일 중입니까? – user460293

+0

@ user460293 - 경고와 함께 컴파일됩니다. 그 경고를 읽고 정답을 얻습니다. – adatapost

6

제네릭의 개념을 잘못 이해했다고 생각합니다. 요점은 클래스 (aa,이 경우)가 ... 일반적 일 수 있다는 것입니다. 고정 된 유형이 아니라 다형성을 통해 여러 유형이 될 수 있습니다. 제네릭 형식은 변수 이름과 유사하지만 클래스의 인스턴스가 아니라 클래스를 나타냅니다. 다음과 같이 할 수 있습니다 :

class aa <T> { 
    public void fun(T myObject){ 
     T s = myObject; 
    } 
} 

이것은 제네릭을 사용하는 적절한 방법입니다. T은 "일부 수업"을 나타냅니다. 문자열의 표시 여부가 너무 커서 (java.lang.String이 아닌 제네릭 유형이되도록) 게시 한 예제가 컴파일되지 않은 이유입니다. 당신이 어떤 클래스,하지만 클래스의 어떤 부분 집합 될하지 않으려면, 당신은 같은 것을 할 수있다 :이 경우

class aa <T extends MyInterface> { 
    public void fun(T myObject){ 
     T s = myObject; 
    } 
} 

을, 당신은 클래스 T의 인스턴스는 또한 인터페이스를 확장 보장하고 있습니다 MyInterface. 그러나 String은 최종본이므로 확장 할 수 없습니다. String 객체를 설정하는 당신이 원하는 모든 였다면, 당신은 전혀 제네릭 필요하지 않습니다 :

class aa { 
    public void fun(){ 
     String s = ""; 
    } 
} 

을 제네릭에 대한 자세한 내용은, 이상 the Java tutorials on generics를 참조하십시오. 기본 java.lang.String 유형을 우선합니다 제네릭 형식 String을 선언하고 이후

0

, 당신의 코드를 입력 같다 :

class aa<T> { 
    T s = ""; 
} 

T 유형의 삭제 후 단순히 Object이지만, 이후는 초기화 할 수 있습니다 아무 것도 (예 : Integer) 컴파일러는 String을 할당 할 수 없습니다.

1

코드가 이해가되지 않습니다. 선언문은 의미가 없습니다. 여기서 실제로 무엇을하려고합니까?

컴파일하는 데 문제가있는 이유는 JDK의 java.lang.String을 숨기는 제네릭 선언을 작성하고 있기 때문입니다.

같은 클래스를 3 번 ​​선언 할 수도 있습니다. 이런 식으로 컴파일하지만, 아마 당신이 원하는 것을 성취하지 못할 수도 있습니다.

class aa<NotString> { 
    public void fun() { 
     String s = ""; // compiles 
    } 
} 

class aa2<NotString> { 
    String s = ""; // compiles 
} 

class aa3<NotString> { 
    String s = (String) ""; // compiling 
}