Scala: бросает вниз java.lang.ClassCastException - PullRequest
1 голос
/ 10 июля 2011

Переход с Scala, не относящийся к Java, принес мне целый ряд трудностей, включая эту.

scala> class A
defined class A

scala> class B extends A      
defined class B

scala> val a = new A
a: A = A@2e893a4a

scala> val b = new B
b: B = B@3a47c130

scala> a.asInstanceOf[B]
java.lang.ClassCastException: A cannot be cast to B
...

scala> b.asInstanceOf[A]
res1: A = B@3a47c130

Я понимаю, что ClassCastException выбрасывается, потому что во время выполнения a не выглядит как B, но на самом деле, это так (насколько я понимаю). Что тут происходит? Есть обходные пути? Спасибо.

Редактировать: как JVM понимает, что a нельзя привести к B? Выполняет ли он поверхностное сравнение между a.getClass и B?

пс. Я пытаюсь добавить приватную переменную в класс библиотеки и переопределить один из методов класса, который принимает класс, определенный в библиотеке, в качестве аргумента (класс, к которому я пытаюсь добавить поле).

Ответы [ 2 ]

6 голосов
/ 10 июля 2011

Это иерархия, которая идет вниз.Класс A является суперклассом, и B расширяется от него, поэтому он более конкретен.Вы не можете идти вверх по иерархии в обобщении.Это выбор дизайна и относится к подтипу .

Есть ли какой-нибудь язык, на котором вы можете подняться по иерархии?Потому что кажется, что вы намекаете, что есть такой язык.

4 голосов
/ 10 июля 2011

Вы не можете разыграть A в B, только наоборот, потому что B более специфичен, чем A.

...