2016-01-31 3 views
1

У меня есть четыре черты A, B, C и D в иерархии типичных алмазных проблем. Я реализовал метод вычисления в признаке A, который проверяет экземпляр callerObject, выполняет некоторый расчет и возвращает объект типа объекта A. вычислить метод успешно в состоянии проверить instanceType из callerObject когда callerObject принадлежит черта B или C, но не работает для объекта признака D, и я получаю следующее исключение класса произнесения:Scala diamond prob, найти имя класса из экземпляра класса D

java.lang.ClassCastException: packageName.B$$anon$1 cannot be cast to packageName.D 

Можете ли вы предложить способ вперед, как я могу проверить Тип объекта с признака D по методу A.

PS: Я новичок в Scala.

+5

Показать код. – Dima

+0

def calculate (other: A): A = { этот матч { case _: B => // Some Function call and return B type obj case _: C => // Some Function call and return C type obj case _: D => // Некоторый вызов функции и возврат D тип obj } } – user1809095

+3

Нет, я не могу прочитать это. Добавьте его в исходный вопрос, правильно отформатируйте, amd show, где вы получите ошибку. Добавьте определения классов. Взгляните сюда на руководство: http: //stackoverflow.com/help/mcve – Dima

ответ

1

С шаблоном, соответствующим порядку case, имеет значение. Убедитесь, что наиболее конкретный класс всегда совпадает с вершиной. Например, если B extends A и C extends B, это означает, что объекты C всегда будет соответствовать все, что выглядит либо для B или A и т.д.

Вот игрушка пример, который может лучше объяснить решение:

sealed trait A { 
    def calculate(i: A) = i match { 
     case _:D => "d" // Make sure the D is checked first! 
     case _:B => "b" 
     case _:C => "c" 
     // If you want to match for A make sure it is added last 
    } 
} 
trait B extends A 
trait C extends A 
trait D extends B with C 

Вот пример в REPL:

val b = new B{} 
val c = new C{} 
val d = new D{} 

b.calculate(b) 
res> "b" 
b.calculate(c) 
res> "c" 
b.calculate(d) 
res> "d" 
+1

Точно меняя порядок, как было предложено выше, работал на меня, большое спасибо. – user1809095

Смежные вопросы