2

So I have a Java method:

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

and I need to override it in Scala. Here is how I am currently doing it:

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

However, this does not compile, and I get the error: method getListOfClasses has incompatible type

What am I doing wrong?

EDIT: MyClass is defined in Java like this:

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

FINAL EDIT: As suggested by @AlexeyRomanov below, changing my Java method return type fixed the problem:

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

1 Answers1

0

It's ugly but asInstanceOf works. This ugliness comes from Java's inability to express covariance and contra-variance.


Interface:

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

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

Scala code:

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]]]
}

Working example:

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