2012-01-27 3 views
0

클래스끼리 서로 전달하는 데 문제가 있습니다.Java에서 클래스 캐스팅 예외

더 자세히 설명하려면이 이미지를 참조하십시오. 내 코드에서

The Image

, 나는 SkillBase s = new SkillBase();을하고 그 클래스의 일부 값을 설정합니다. 그렇다면 Subclass sub = (Subclass)s;을 실행하려고 시도했지만 실행하면 ClassCastException이 발생합니다.

작은 디버그 부분을 추가하여 instanceof이 true를 반환하는지 확인합니다.

내가 aswell 여기에 몇 가지 질문을보고, 구글을 시도하고 그들을 그래서

(그들 중 누구도 나를 위해이었다 대답이 없었다) 읽었습니다, 나는 무엇을해야합니까?

답변

5

SkillBaseSubclass의 인스턴스가 아닙니다. 왜 캐스팅이 작동할까요? 시도해보십시오.

SkillBase s = new Subclass(); 
Subclass sub = (Subclass)s; 

성공하면됩니다. 또한 나는 내가, 당신이 instanceof으로 정확하지 않습니다 생각 어떤 것을 :

s instanceof Subclass 

가 귀하의 경우 위의 코드에서 true하지만 false를 얻을 수 있습니다. 모든 개는 동물 * 때문에 항상 AnimalDog 캐스팅 할 수 있지만, 일부 동물은 개 아니기 때문에 실패 할 수 있습니다 AnimalDog에 캐스팅 :

현실 세계의 관점에서 생각. 사실

*는, 컴파일러는 당신을 위해, 그것은

+0

사실, 그게 내가하고있는 일이다. 서브 클래스는 SkillBase를 확장하므로 캐스팅 할 수 있어야합니다. – Lolmewn

+0

추가하려면 :'Subclass' *는 *'SkillBase'입니다. 반대로 ** 사실이 아닙니다. 부모 클래스를 자식으로 캐스트 할 수 없습니다. –

+0

@Lolmewn : 실물 예제를 추가했습니다. –

0

수퍼 클래스 참조에 하위 클래스 만 할당 할 수 있습니다. 이렇게 생각하면 Subclassf()이라는 새로운 방법을 추가하여 Superclass을 확장합니다. 지금 Superclass은 f()와 그에 따른 문제에 대해을 모릅니다.

0

아마도 instanceof을 잘못 사용했을 것입니다.

SkillBaseSubclass이 아니므로 런타임이 충돌 할 수 있습니다.

그 반대의 경우도 마찬가지입니다.

+0

아, 난을 참조하십시오. 고마워, 이제 주위에 방법을 찾으려고. – Lolmewn

0

의 그것이 서브 클래스로 인스턴스화되지 않았기 때문에 서브 클래스에 캐스트 할 수없는 다형성 (polymorphism)로 알려져 있다고한다. Skillbase입니다. 하위 클래스를 사용하려는 이유는 무엇입니까?

Subclass s = new Subclass(); 

당신은 여전히 ​​그들이 Skillbase 상속하지 토끼와 캐스트가 더 이상 필요하기 때문에 원하는 매개 변수를 설정할 수 있습니다.

+0

왜냐하면 저는 for 루프를 사용하고 있기 때문에 나머지를하기 전에 내가 무엇을보고 있는지 확인해야 할 것입니다. 그러나 이것은 다른 것들이 실패 할 경우 좋은 옵션처럼 보입니다. – Lolmewn

0

캐스팅을 제대로 사용하지 않는 것이 문제입니다. 클래스는 항상 부모로 캐스팅 될 수 있지만 그 반대의 경우는 아닙니다.개념은 자식 클래스 (정의에 따라)가 부모의 구조를 알고 있으며 (정의에 따라) 부모의 모든 서명을 이미 지원한다는 것입니다. 결과적으로, 부모는 자식의 하위 집합입니다.

그러나 역수는 사실이 아닙니다. 부모 클래스는 자식 클래스 및/또는 자식이 구조에 추가 서명을 추가했는지 여부를 알지 못합니다. 따라서 컴파일러에서 부모를 자식으로 처리하고 자식이 부모에있는 모든 메서드를 사용할 수 있도록 할 방법이 없습니다.

물 (어린이)은 액체 (부모)이지만 모든 액체가 물이 아닙니다. 결과적으로, 액체에 대한 측정 (즉, 양, 점도 등)은 물뿐 아니라 물에 대해서도 마찬가지입니다 (예 : 물의 밀도는 오일의 밀도와 완전히 다릅니다).

이 상황을 모두 되돌리기 위해 SubclassSkillbase으로 캐스팅 할 수 있지만 그 반대의 경우는 아닙니다.

Subclass instanceof Skillbase == true 
(Skillbase) new Subclass() - also valid 
(SKillbase) new Sub#2 - also valid 

등 ...

관련 문제