2012-07-25 2 views
2

클래스 매개 변수를 확장하고 나는 오류 클래스 원에서 모양 <를 확장 가리키는자바 제네릭 내가 오류가 발생

public interface Shapes<T>{ 
//methods here 
} 

public class ShapeAction<T> implements Shapes<T>{ 
//Methods and implementations here 
} 

public class Circle extends ShapeAction<T>{ 
//Some methods here 
} 

내 프로그램에서이 구조를 가지고 는 T가 해결 될 수 없다 "라고 T> 유형". T를 string으로 설정하면 오류는 사라지 겠지만 이는 또한 하나의 데이터 유형 만 사용할 수 있음을 의미합니다. 어떤 데이터 유형 (String, int, double 등)을 사용할 수 있도록 <에 무엇을 넣어야합니까? 아니면 내가 잘못 했습니까?

+0

오류를 게시하십시오. –

+0

Shape 및 ShapeAction에서 T는 어디에 사용합니까? – Andrew

답변

6

두 가지 개념이 있습니다. 작성시

public class ShapeAction<T> 

이것은 인스턴스 생성시 일부 클래스로 매개 변수화 될 클래스를 작성한다는 의미입니다. 당신은 그 때가 언제인지 모른다. 그래서 당신은 이것을 T와 같이 언급한다. 당신이

public class Circle extends ShapeAction<T> 

을 쓸 때

는 그러나 이것은 당신이 Circle 유형 T으로 매개 변수화 ShapeAction의 서브 클래스로 원하는 것을 의미한다. 그러나 T은 무엇입니까? 컴파일러는 다음과 같이 말할 수 없습니다. Circle을 타입 변수없이 선언했습니다.

두 가지 옵션이 있습니다.당신은 당신이 그것을 작동 유형을 지정 Circle의 새로운 인스턴스를 만들 때

public class Circle<T> extends ShapeAction<T> 

이 방법이 슈퍼 클래스 확장 : 당신은 너무 서클 제네릭 할 수 있습니다.

ShapeAction이 어떤 유형이든 지정할 수 있지만 하위 클래스를 일반적으로 지정하지 않으면 어떻게됩니까?

public class Circle extends ShapeAction<Object> 

이 방법 Circle는 제네릭이 아닌 유지,하지만 당신은 슈퍼 클래스로 모든 데이터 유형을 사용할 수 있습니다 Object 사용합니다.

+0

Malcolm에게 감사의 말을 전합니다. – dimas

+0

위대한 설명 !!! – Chaz32621

4

시도해 보셨습니까?

public class Circle<T> extends ShapeAction<T>{ 
//Some methods here 
} 

컴파일러가 먼저 그것을 정의하지 않는 한 T 인수가 extends ShapeAction<T>에서 무엇을 의미하는지 알 수있는 방법이 없습니다.

Circle에 대한 참조를 사용하는 경우 T에 대한 형식 인수를 제공해야하며,이 인수는이 형식의 다른 모든 모양에 계단식으로 연결됩니다. 클래스 계층 구조의 나머지 부분에 대한, 등등

public class Circle<Integer> extends ShapeAction<Integer>{ 
    //Some methods here 
} 

그리고 :

Circle<Integer> myInt; 

는 컴파일러로 코드를 해석하게됩니다.

이와 같이 Circle 클래스에 T 유형을 정의하지 않은 경우. 컴파일러가 ShapeAction의 매개 변수화 된 유형을 알리는 방법은 없으며 여기에서 문제의 원인 일 가능성이 큽니다.

+0

고맙습니다.하지만 Circle 클래스에 다른 을 정의해야하는 이유는 무엇입니까? 그 클래스 Circle이 이미 인 ShapeAction을 확장했다고 생각 했습니까? – dimas

+0

@dimas 간단히 말해서 그런 식으로 작동하지 않습니다. 매개 변수가있는 형식은 사용자가 암시하는 것처럼 상속되지 않습니다. –

+1

대단히 고마워요! – dimas

1

당신은 정말 당신이 달성하려고하는지 말해 우리에게 충분한 코드를 표시하지만, 일반적으로하지 않은 : 당신은 인수의 여러 유형을 수용 할 수있는 방법을 확인하려면

, 당신은 매개 변수화 할 메서드이 아닌 전체 클래스

public <T> Shape takeAction(T argument); 

은 분명히 그 많은 시간이 유형의 안전을 컴파일 제공 정말하지 않습니다, 당신은 아마 아직도 수동으로 런타임에 제한 유형의 어떤 부분 집합에 대한 인수를 해결해야합니다.

+0

답변을 주셔서 감사합니다. 저는 제네릭과 다형성을 실험하려고합니다. 하지만 인터페이스를 포함하여 두 클래스에 삽입 한 메소드가별로 없습니다. 클래스 Circle의 기능을 유형이 인 ShapeAction의 기능으로 확장 할 수 있는지 확인하고 싶습니다. 그럴 경우, ShapeAction에서 타입이 인 메소드를 사용할 수 있다고 생각했습니다. 여기서 서클 클래스에 있어야하는 유형을 명시 적으로 선언 할 수있었습니다. – dimas