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

在Scala中模拟Java层次结构时不兼容类型,java,scala,types,Java,Scala,Types,更新15/1:提供了在类型参数中使用自定义类的更复杂示例 我试图为现有的Java接口提供一个Scala接口。在java端,您有以下层次结构: interface JavaBuffer interface JavaStreamBase interface JavaReadStream<T> extends JavaStreamBase interface JavaTimeoutStream extends JavaReadStream<JavaBuffer> scala

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

我试图为现有的Java接口提供一个Scala接口。在java端,您有以下层次结构:

interface JavaBuffer
interface JavaStreamBase
interface JavaReadStream<T> extends JavaStreamBase 
interface JavaTimeoutStream extends JavaReadStream<JavaBuffer>
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
,在Scala中,我试图强制
JavaReadStream[ScalaBuffer]
保持不变,但这不起作用

解决此问题的一种方法是在ScalaReadStream trait中有两个类型参数,例如

trait ScalaReadStream[T, J] extends ScalaStreamBase {
  def asJava: JavaReadStream[J]
}
class ScalaTimeoutStream(val asJava: JavaTimeoutStream) 
    extends ScalaReadStream[ScalaBuffer, JavaBuffer]
但是,这会让类型变得不必要的复杂

路径依赖类型在这里会更好吗?还有其他解决办法吗

非常感谢您提前提供的帮助

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


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

使用
java.lang.Long
的选项有效,因此您的问题得到了解决。虽然看起来你应该为未解决的问题提供例子。(有什么原因不能在Scala中直接使用Java接口吗?)更新问题描述以解决您的问题。感谢您的更新。我不知道如果没有进一步的类型参数(您拒绝了它,因为它使事情变得太复杂),依赖路径的类型在这里会有什么帮助。我很抱歉不能提供更好的帮助。我会使用隐式转换。类型类将为这个imho提供一个好的、干净的解决方案。
trait ScalaReadStream[T, J] extends ScalaStreamBase {
  def asJava: JavaReadStream[J]
}
class ScalaTimeoutStream(val asJava: JavaTimeoutStream) 
    extends ScalaReadStream[ScalaBuffer, JavaBuffer]