ИМХО самый идиоматических способ сделать это в Scala использует классы типов:
class MyClass1(val s: String)
class MyClass2(val s: String)
trait ResultFinder[T] {
def findResult(t: T): String
}
object ResultFinder {
def findResult[T: ResultFinder](t: T): String = implicitly[ResultFinder[T]].findResult(t)
implicit object RFMyClass1 extends ResultFinder[MyClass1] {
override def findResult(t: MyClass1): String = t.s + " of MyClass1"
}
implicit object RFMyClass2 extends ResultFinder[MyClass2] {
override def findResult(t: MyClass2): String = t.s + " of MyClass2"
}
}
REPL сессия:
scala> import ResultFinder.findResult
import ResultFinder.findResult
scala> val c1 = new MyClass1("hello")
c1: MyClass1 = [email protected]
scala> val c2 = new MyClass2("hello")
c2: MyClass2 = [email protected]
scala> findResult(c1)
res0: String = hello of MyClass1
scala> findResult(c2)
res1: String = hello of MyClass2
Это решение полностью типобезопасны. Там нет броска, даже под капотом. Вместо этого метод сопоставления образцов использует литые под капотом. Еще одним преимуществом этого решения является то, что он работает для более сложных типов, таких как List[MyClass1]
, при условии, что в сфере видимости имеется неявный экземпляр. Совпадение шаблонов не будет работать для List[MyClass1]
из-за стирания типа.
P.S .: Я полагаю, вы использовали myTargetObject
в темп переменной в, но вы на самом деле не нужно, потому что единственный способ выйти из findResult
осмысленно является возвращающая String
.
Кастинг, как правило, плохой практики, и то, как вы это делаете, в отчаянии. 'myTargetObject' является' Option [Any] ', поэтому он не будет компилироваться, однако весь код, вероятно, должен быть переписан. Не могли бы вы описать свою проблему высокого уровня для нас, чтобы найти лучшее решение? – Dici