Reputation: 63062
Following is a method in a java base class
public interface BenchmarkDriver {
public boolean test(Map<Object, Object> ctx) throws Exception;
Here is the Scala class:
class SparkSqlQueryBenchmark extends BenchmarkDriver
And my (incorrect) attempt to override the java interface method:
@throws(classOf[java.lang.Exception])
override def test(ctx: java.util.Map[java.lang.Object, java.lang.Object]) : java.lang.Boolean = {
Here is the compiler error:
[ERROR] SparkAbstractBenchmark.scala:24: error: class SparkAbstractBenchmark needs to be abstract, since method test in trait BenchmarkDriver
of type (x$1: java.util.Map[Object,Object])Boolean is not defined
SparkSqlQueryBenchmark.scala:30: error: overriding method test in trait BenchmarkDriver
of type (x$1: java.util.Map[Object,Object])Boolean;
[ERROR] method test has incompatible type
[ERROR] override def test(ctx: java.util.Map[java.lang.Object, java.lang.Object])
: java.lang.Boolean = {
[ERROR]
So what needs to be fixed on the scala override side?
Update After Marth's suggestion to change to Boolean
@throws(classOf[java.lang.Exception])
override def test(ctx: java.util.Map[java.lang.Object, java.lang.Object]) : Boolean = {
Error looks similar but in any case here it is
[ERROR] SparkAbstractBenchmark.scala:24: error: class SparkAbstractBenchmark needs
to be abstract, since method test in trait BenchmarkDriver of type (x$1:
java.util.Map[Object,Object])Boolean is not defined
[ERROR] class SparkAbstractBenchmark(cacheName: String) extends BenchmarkDriverAdapter {
[ERROR] ^
[ERROR] one error found
Upvotes: 1
Views: 464
Reputation: 24802
The problem is that Scala's Boolean
is not equivalent to Java's Boolean
but to boolean
.
Either change the Scala method to return a Boolean
(not a java.lang.Boolean
), or change the Java interface to return a Boolean
.
Basically :
Java | Scala
----------------------------
Boolean | java.lang.Boolean
boolean | Boolean
Upvotes: 6