使用Scala覆盖使用“?extends”

时间:2016-12-15 00:10:49

标签: scala

所以我有一个Java方法:

public abstract List<Class<? extends MyClass>> getListOfClasses();

我需要在Scala中覆盖它。以下是我目前的工作方式:

override def getListOfClasses: java.util.List[Class[_ <: MyClass[_]]] = { null }

然而,这不编译,我得到错误:方法getListOfClasses具有不兼容的类型

我做错了什么?

编辑: MyClass在Java中定义如下:

abstract class MyClass[T] extends MyOtherClass[T] {...}

最终编辑: 正如下面@AlexeyRomanov所建议的,更改我的Java方法返回类型修复了问题:

public abstract List<Class<? extends MyClass<?>>> getListOfClasses();

1 个答案:

答案 0 :(得分:0)

它很难看但asInstanceOf有效。 这种丑陋来自于Java无法表达协方差和反方差。

接口:

import java.util.List;
public abstract class Game2J {
  public interface MyClass {}

  public abstract List<Class<? extends MyClass>> getListOfClasses();
}

Scala代码:

import java.util

import Game2J.MyClass
import scala.collection.JavaConverters._

class Game2S extends Game2J {
  class MyClass1 extends MyClass
  class MyClass2 extends MyClass

  override def getListOfClasses: util.List[Class[_ <: MyClass]] =
    List(classOf[MyClass1], classOf[MyClass2]).asJava.asInstanceOf[util.List[Class[_ <: MyClass]]]
}

工作示例:

public class Game2 {
  public static void main(String[] args) {
    new Game2S().getListOfClasses().stream().forEach((cl) -> System.out.println(cl.getSimpleName()));
  }
}