相关疑难解决方法(0)

Scala:重写通用Java方法II

在Scala中,我需要覆盖以下给定的Java类和方法:

public abstract class AbstractJava<T> {
    protected abstract T test(Class<? extends T> clazz);
}

public class ConcreteJava extends AbstractJava<Object> {
    @Override
    protected Object test(Class<?> clazz) {
        return null;
    }
}

// Scala
class ConcreteScala extends ConcreteJava {
    protected override def test(clazz: Class[_ <: AnyRef]): AnyRef =
        super.test(clazz)
}
Run Code Online (Sandbox Code Playgroud)

我收到了编译错误:

error: ambiguous reference to overloaded definition,

both method test in class ConcreteJava of type 
(clazz: java.lang.Class[_])java.lang.Object

and method test in class AbstractJava of type 
(clazz: java.lang.Class[_ <: java.lang.Object])java.lang.Object

match argument types …
Run Code Online (Sandbox Code Playgroud)

scala scala-java-interop

15
推荐指数
1
解决办法
2775
查看次数

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

假设我们有以下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中的泛型.

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

java generics scala interface type-parameter

4
推荐指数
1
解决办法
4327
查看次数