2016-12-15 26 views
2

所以我有一个Java方法:使用斯卡拉要覆盖一个使用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] {...} 

FINAL编辑: 如@AlexeyRomanov建议下面,改变我的Java方法返回类型固定的问题:

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

在黑暗中拍摄,但你需要添加一对括号的'()'到Scala'def'的末尾? – Alec

+0

对我来说,它正在编译或我做错了什么。看看这个项目:https://github.com/paweln1986/SOFIssue – PawelN

+1

Java签名已经有问题了,因为它使用原始类型。你可以尝试改变它为'List >>(和问题中的Scala签名)? –

回答

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())); 
    } 
}