使用"和#34;在scala中向上转换外部Java库关键字产生类型不匹配错误

时间:2017-11-04 22:58:31

标签: java scala

我正在使用一个带有实现多个接口的类的外部Java库,但是我对如何正确实例化该类以使后来的函数看到它实现的特定接口的细节感到困惑。

我已尝试直接使用类似的内容进行直播:

val my_obj : InterfaceName = new ClassThatImplementsInterface()

虽然这似乎在基本示例中起作用,但在我的特定应用程序上下文中,编译器并未接受它。所以,我尝试使用以下语法,当我创建一些单独的简单演示代码时,编译器也接受了这个语法:

import Demo._

object MyClass {
  def main(args : Array[String]): Unit = {    
    val my_obj : Demo with MyInterface = new Demo with MyInterface  
  }
}

不幸的是,这种语法也无法在特定的应用程序上下文中进行编译。因此,例如使用名为javaplex.jar的jar文件,如下所示:

import edu.stanford.math.plex4.metric.interfaces.AbstractSearchableMetricSpace
import edu.stanford.math.plex4.metric.impl.ExplicitMetricSpace

object MetricSpaceBuilder {
  def buildSpace(similarity_matrix : Array[Array[Double]]): Unit = {    
    val metric_space : ExplicitMetricSpace with AbstractSearchableMetricSpace[Array[Int]] = new ExplicitMetricSpace(similarity_matrix) with AbstractSearchableMetricSpace[Array[Int]]
  }
}

编译:

scalac -cp javaplex.jar  MetricSpaceBuilder.scala 

生成以下错误消息:

MetricSpaceBuilder.scala:6: error: type mismatch;
 found   : edu.stanford.math.plex4.metric.impl.ExplicitMetricSpace with edu.stanford.math.plex4.metric.interfaces.AbstractSearchableMetricSpace[Array[Int]]
 required: edu.stanford.math.plex4.metric.impl.ExplicitMetricSpace with edu.stanford.math.plex4.metric.interfaces.AbstractSearchableMetricSpace[Array[Int]]
    val metric_space : ExplicitMetricSpace with AbstractSearchableMetricSpace[Array[Int]] = new ExplicitMetricSpace(similarity_matrix) with AbstractSearchableMetricSpace[Array[Int]]
                                                                                            ^
one error found

为什么编译器报告它没有找到所需的类型?

1 个答案:

答案 0 :(得分:2)

如果我写

,它会编译
object MetricSpaceBuilder {
  def buildSpace(similarity_matrix : Array[Array[Double]]): Unit = {    
    val metric_space : ExplicitMetricSpace with AbstractSearchableMetricSpace[Integer] = new ExplicitMetricSpace(similarity_matrix) with AbstractSearchableMetricSpace[Integer]
  }
}

由于ExplicitMetricSpace已经实施AbstractSearchableMetricSpace<Integer>,因此无法实现AbstractSearchabelMetricSpace<int[]>