更新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)
^
这里的问题是JavaTimeoutStream
是JavaReadStream<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中发生的匹配的层次结构。如果我没有别的选择,或者层次结构变得太复杂,无法处理这个边缘的情况,我可能会走这条路。