在Scala中模仿Java层次结构时不兼容的类型

时间:2015-01-14 09:35:08

标签: java scala types

更新15/1 :在类型参数中使用自定义类提供了更复杂的示例

我正在尝试为现有Java接口提供Scala接口。在java方面,您具有以下层次结构:

interface JavaBuffer
interface JavaStreamBase
interface JavaReadStream<T> extends JavaStreamBase 
interface JavaTimeoutStream extends JavaReadStream<JavaBuffer>

在Scala版本中,我正在尝试提供类似的结构以使其熟悉,其中一个要求是您需要能够在层次结构的任何阶段获取Java版本。所以,我有这样的事情:

trait ScalaBuffer {
  def asJava: JavaBuffer 
}
trait ScalaStreamBase {
  def asJava: JavaStreamBase
}
trait ScalaReadStream[T] extends ScalaStreamBase {
  def asJava: JavaReadStream[T]
}
class ScalaTimeoutStream(val asJava: JavaTimeoutStream) 
  extends ScalaReadStream[ScalaBuffer]

scala代码无法使用此错误进行编译:

Error:(22, 25) overriding method asJava in trait ScalaReadStream of type => JavaReadStream[ScalaBuffer];
 value asJava has incompatible type
class ScalaTimeoutStream(val asJava: JavaTimeoutStream)
                    ^

这里的问题是JavaTimeoutStreamJavaReadStream<JavaBuffer>,而在Scala我试图强制JavaReadStream[ScalaBuffer]是相同的,这是行不通的。

解决此问题的一种方法是在ScalaReadStream特性中使用两个类型参数,例如

trait ScalaReadStream[T, J] extends ScalaStreamBase {
  def asJava: JavaReadStream[J]
}
class ScalaTimeoutStream(val asJava: JavaTimeoutStream) 
    extends ScalaReadStream[ScalaBuffer, JavaBuffer]

然而,这会让不必要的IMO类型变得复杂并且复杂化。

路径依赖类型会在这里有所帮助吗?还有其他解决方案吗?

非常感谢您提前获得任何帮助!

P.S。这是一个小例子,但不,我不想在Scala代码中使用Java接口,因为实际上Java类中充斥着Java类引用,Java集合等等。

p.s.2。我知道我也可以使用隐式转换而不是尝试模仿Java层次结构,但这样做会给来自Java的用户增加额外的复杂性,因为他们没有与Scala中发生的匹配的层次结构。如果我没有别的选择,或者层次结构变得太复杂,无法处理这个边缘的情况,我可能会走这条路。

0 个答案:

没有答案