2011-08-26 7 views
1
나는 자바에서 다음을 수행하려고 해요

확장 :는 제네릭 형식의 클래스, 자바

public class ClassName<E> extends E 

그러나 이렇게을, 나는 점점 해요 :

error: unexpected type 

단순히 그것을인가 그 사건은 자바가 할 수 없나요? - 그렇다면 어떻게이 효과를 얻을 수 있습니까? 그것은 모두, 템플릿, C++로 완벽하게 작동 : 정말 달성하기 위해 노력하고있어

template<typename E> 
class ClassName: public E 

, 자바 다중 상속의 효과를 달성하기 위해 체인 클래스 함께 이러한 방법으로, 할 수있을 것입니다.

답변

2

C++ 템플릿에서는 컴파일 타임에 다른 클래스의 효과가 생성됩니다. 즉, 모든 E에 대해 ClassName의 다른 버전을 얻게됩니다.

자바에서는 그 이름을 가진 하나의 클래스가 있으며 컴파일시에 유형 검사 이외의 목적으로는 제네릭 타입이 사용되지 않습니다. 따라서 Java는 유형 E에서 확장 할 수 없습니다.이 경우 컴파일러는 여러 인스턴스를 작성해야하기 때문입니다.

또한 일반 유형도 인터페이스가 될 수 있으며 class ClassName extends Serializable은 전혀 컴파일되지 않습니다. :)

+0

어떻게 든이 오래된 질문에 우연히 마주 쳤습니다. 왜 이것이 받아 들여진 대답이 아닌지 잘 모릅니다. –

0

Java는 할 수 없습니다. 유형 삭제 때문입니다. Java 클래스가 컴파일 될 때, 제네릭 타입 (E)은 어떤 구체적인 클래스/인터페이스로 변경됩니다 - 컴파일러는 타입이 무엇인지를 결정할 수 있어야합니다. 또한 Java는 다중 상속을 지원하지 않습니다. 클래스는 하나의 클래스 만 확장 할 수 있지만 여러 인터페이스를 구현할 수 있습니다.

7

좋음 또는 나쁨으로 인해 Java에는 다중 상속이 없습니다. Java의 제네릭은 C++보다 훨씬 다릅니다. 그들은 단지 타입 안전을 컴파일합니다. 런타임시 제네릭 정보가 지워집니다.

+0

그래서 원하는 효과를 어떻게 얻을 수 있습니까? – Skeen

+0

@Skeen - 여기를보세요 - http://stackoverflow.com/questions/3556652/how-do-java-interfaces-simulate-multiple-inheritance. –

+0

알았으니 래퍼 함수를 ​​써야합니다. – Skeen

0

E은 type/class가 정의되어 있지 않으므로이 작업을 수행 할 수 없습니다.

+0

하지만 그 곳에서 같은 코드를 복사해야 할 것입니다. – Skeen

+0

@Skeen, 이러한 모든 메서드를 단일 클래스로 구현하고 해당 메서드가 필요한 클래스에서 확장합니다. 개체를 사용하여 이미 정의 된 메서드를 호출 할 수도 있습니다. – ngesh

+0

사실, 이미 확장되어있는 여러 클래스에서이 클래스가 필요할 것이므로 이것이 내가 이것을하고 싶었던 이유입니다. – Skeen