Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2015-07-16) 在Scala中调用Java中定义的泛型方法

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

Java代码:

public class JavaJsonParser {
    public static <T> T asObject(String json, Class<T> cls) {
        System.out.println("# in java: " + json + ", cls: " + cls);
        throw new RuntimeException("To be implemented");
    }
}

Scala代码:

object ScalaJsonParser extends App {

  def asObject[T: Manifest](json: String): Option[T] = {
    Try(JavaJsonParser.asObject[T](json, classOf[T]).toOption
  }
}

这样编译会报错:

Error:(8, 50) class type required but T found
    Try(JavaJsonParser.asObject[T](json, classOf[T])).toOption
                                                 ^

正确写法是:

object ScalaJsonParser {
  def asObject[T: Manifest](json: String): Option[T] = {
    Try(JavaJsonParser.asObject[T](json, implicitly[Manifest[T]].runtimeClass.asInstanceOf[Class[T]])).toOption
  }
}

跑一个:

ScalaJsonParser.asObject[String]("{}")

将会打印出:

# in java: {}, cls: class java.lang.String
comments powered by Disqus