2016-12-15 6 views
2

「を拡張?」:使用するJavaメソッドをオーバーライドするのScalaを使用したので、私は、Javaメソッド持って

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

を、私はScalaでそれをオーバーライドする必要があります。ここで私は現在、それをやっている方法です:

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

しかし、これはコンパイルできない、と私はエラーを取得する:メソッドgetListOfClassesは、互換性のない型

私が間違って何をやっているを持っていますか?

EDIT:

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

ショットができますが、括弧のペアを追加する必要があります'()'をScalaの 'def'の終わりに追加しますか? – Alec

+0

私にとってそれはコンパイルしているか、私は何か間違っている。このプロジェクトを見てください:https://github.com/paweln1986/SOFIssue – PawelN

+1

Javaの署名は、生の型を使用しているので、すでに問題があります。 'List >> '(Scalaのような署名) –

答えて

0

:問題を修正し、私のJavaメソッドの戻り値の型を変更し、以下の@AlexeyRomanovによって示唆されるように :

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

FINAL EDIT: は、MyClassのは、次のようにJavaで定義されています醜いですが、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())); 
    } 
} 
関連する問題