2016-11-05 2 views
1

Я хочу сделать следующий код не бросить какую-либо ошибкуScala объект Cast к другому типу

case class A(value: String) 
val a = A("I hope to be string one day") 
val value = a.asInstanceOf[String] // java.lang.ClassCastException: A cannot be cast to java.lang.String 

Я хочу изменить класс А, например, что ниже работы

val value = a.asInstanceOf[String] // I hope to be string one day 

делает кто-нибудь знает решение?

+0

определяют его как неявной класс случае – DevZer0

+0

'ошибка: Недопустимая комбинация модификаторов: неявное и случай для: класса Ā' – Dylan

+0

я могу показать вам, что я имею в виду, но все зависит от того, что вы пытаетесь сделать. Вы пытаетесь предоставить дополнительную функциональность строкам? что такое прецедент? – DevZer0

ответ

6

A не может быть отлит до String, потому что он не является строкой. Вы ничего не можете сделать, чтобы сделать работу a.asInstanceOf[String].

Что сказал, вы могли бы конвертировать из A в String, явно или неявно:

// explicit 
val s: String = a.value 

// implicit conversion (although typically frowned-upon as bad practice) 
implicit def unwrapA(a: A): String = a.value 
val s: String = a 
+0

Я думаю, вместо «компиляции» вы подразумеваете «не бросать« ClassCastException ». –

+0

отредактировал, спасибо. – Dylan

0

Как я уже говорил, если ваш вариант использования является добавление дополнительных функциональных возможностей к существующему классу, такие как string вы можно определить implict class

implicit class Foo(val s: String) { 
    def inc = s.map(c => (c + 1).toChar) 
} 

, а затем, если вы можете довести этот класс в области, которую можно выполнить следующие действия

"foobarstring".inc //strings now have a function called inc 

Более подробную информацию по этой теме http://docs.scala-lang.org/overviews/core/implicit-classes.html

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