如何在Scala中扩展包含通用方法的Java接口?

shaolang :

假设我们具有以下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中的方法栏”。

提前致谢!

更新:丑陋的事实是:我误解了Java中的泛型。

无论如何,在尼古拉斯(Nicolas)和沃尔特(Walter)的答案中都显示了解决我难题的方法,尽管我更喜欢沃尔特(Walter)的答案,因为它不那么冗长。

沃尔特·张(Walter Chang):

这有效:

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"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章