Backward compatibility would be completely destroyed, indeed. If you have an easy way:
def foo[A](a: A)(implicit something: SomeType) = ???
, Scala ClassTag . . , foo(a)(someTypeValue), . .
Java . , :
def foo[A : ClassTag](a: A) = ???
ClassTag Scala, Java . ClassTag .
ClassTag<MyClass> tag = scala.reflect.ClassTag$.MODULE$.apply(MyClass.class);
foo(a, tag);
Java 100% , . , , . , , ClassTag, , , .
, , (I, ) . , , ClassTag , , .
, , ClassTag, . , , ClassTag . , , , ClassTag :
def foo[A : ClassTag](a: A): A = a
, . .
val list = List(1, "abc", List(1, 2, 3), List("a", "b"))
def find[A: ClassTag](l: List[Any]): Option[A] =
l collectFirst { case a: A => a }
scala> find[List[String]]
res2: Option[List[String]] = Some(List(1, 2, 3))
ClassTag , , . . java.lang.String ClassTag. , . ClassTag , getClass. ,
case a if(a.getClass == classOf[String]) => a.asInstanceOf[String]
, , , ClassTag. - find, .
// Can't compile
def find[A](l: List[Any]): Option[A] =
l collectFirst { case a if(a.getClass == classOf[A]) => a.asInstanceOf[A] }
, - ClassTag, ? a.classTag == classTag[A], A . ClassTag .