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

sha*_*ang 4 java generics scala interface type-parameter

假设我们有以下Java接口:

// Java
public interface Foo {
    <T> T bar(Class<T> c);
}
Run Code Online (Sandbox Code Playgroud)

我应该如何在Scala中扩展它?写作

// Scala
class FooString extends Foo {
  override def bar(c: Class[String]): String = "hello, world";
}
Run Code Online (Sandbox Code Playgroud)

将导致编译器抛出"类FooString需要是抽象的,因为类型为[T ](Class [T])T的特征Foo中的方法栏未定义."

提前致谢!

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

在任何情况下,我的困境的解决方案都显示在尼古拉斯和沃尔特的答案中,尽管我更喜欢沃尔特的答案,因为它不那么冗长.

Nic*_*las 6

它不起作用,因为您没有正确实现接口.你的方法n scala的siganture必须是:

def bar[T](c:Class[T]):T
Run Code Online (Sandbox Code Playgroud)

只有当你想要吨实现Foo时,你才能修复String的行为.

根据我们的讨论,第三次尝试:

def bar[T](c:Class[T]):T = {
  // Some stuff
  val o:Any = myUntypedFunction(env)
  c.cast(o)
}
Run Code Online (Sandbox Code Playgroud)

根据上下文,myUntypedFunction将创建一个对象,然后使用class参数来转换结果并获取T对象.再一次:这种行为在java和scala中是相同的.