假设我们具有以下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)的答案,因为它不那么冗长。
这有效:
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] 删除。
我来说两句