所以我有一个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();
答案 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()));
}
}