如何在Scala中扩展包含泛型方法的Java接口?
发布时间:2020-12-16 18:19:25 所属栏目:安全 来源:网络整理
导读:假设我们有以下 Java接口: // Javapublic interface Foo { T T bar(ClassT c);} 我应该如何在Scala中扩展它?写作 // Scalaclass FooString extends Foo { override def bar(c: Class[String]): String = "hello,world";} 将导致编译器抛出“类FooString需
假设我们有以下
Java接口:
// Java public interface Foo { <T> T bar(Class<T> c); } 我应该如何在Scala中扩展它?写作 // Scala class FooString extends Foo { override def bar(c: Class[String]): String = "hello,world"; } 将导致编译器抛出“类FooString需要是抽象的,因为类型为[T](Class [T])T的特征Foo中的方法栏未定义.” 提前致谢! 更新: 在任何情况下,我的困境的解决方案都显示在尼古拉斯和沃尔特的答案中,尽管我更喜欢沃尔特的答案,因为它不那么冗长. 解决方法
这有效:
class FooString extends Foo { def bar[String](c: Class[String]): String = "hello world".asInstanceOf[String] } val fs = new FooString println(fs.bar(classOf[String])) 编辑: 来自@Eastsun的评论是正确的.由于bar是类型参数为T的泛型方法,因此Scala中bar的实现也必须是通用方法.我认为在Scala中实现Foo的正确方法如下: class FooString extends Foo { def bar[T](c: Class[T]): T = c.newInstance.asInstanceOf[T] // c gotta have a default constructor } val fs = new FooString println(fs.bar(classOf[String]).getClass) // prints "class java.lang.String" println(fs.bar(classOf[java.util.Date]).getClass) // prints "class java.util.Date" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |