小编rob*_*ert的帖子

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:覆盖返回null的泛型Java方法

我需要在Scala类中覆盖以下Java方法:

public class Test<T> {
    public T test(T o, boolean x) {
        if (x) {
            return o;
        }
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用以下方法(在Scala中),编译器抱怨说,"Null类型的表达式不符合预期的类型T":

class Test2[T] extends Test[T] {
  override def test(o: T, x: Boolean): T = {
    if (x) {
      return o
    }
    return null
  }
}
Run Code Online (Sandbox Code Playgroud)

我也试图定义Option[T]为返回值,但是再一次,编译器抱怨方法签名不匹配.

任何的想法?- 谢谢!


编辑:

丹尼尔的建议适用于最初发布的问题; 但是,遗憾的是我的实际问题仍然略有不同(通过在方法中使用泛型类型参数,而不是,定义)(抱歉):

Java的:

public class Test {
    public <T> T test(T o, boolean x) {
        if (x) {
            return o;
        } …
Run Code Online (Sandbox Code Playgroud)

scala

7
推荐指数
2
解决办法
4597
查看次数

标签 统计

scala ×2

scala-java-interop ×1