我有一个Java接口,它使用这样的交集类型:
public interface JavaIntersection{
public <E extends JComponent & Runnable> void foo(E arg);
}
我正在尝试创建一个实现此接口的Scala类。所以我写了以下内容:
class ScalaIntersection extends JavaIntersection{
override def foo[E <: JComponent with Runnable](arg:E):Unit = ???
}
这样可行但是,在我写的完整程序中,这种类型在多个地方使用。每次必须包含完整类型将是非常乏味的。所以我修改了这样的类:
class ScalaIntersection extends JavaIntersection{
type RunnableComponent <: JComponent with Runnable
override def foo(arg:RunnableComponent):Unit = ???
}
通过此更改,程序不再编译,并出现以下错误:
错误:类ScalaIntersection需要是抽象的,因为类型为[E&lt ;:javax.swing.JComponent with Runnable](arg:E)Unit的trait JavaIntersection中的方法foo未定义
错误:foo方法无法覆盖任何内容 [INFO]注意:ScalaIntersection类的超类包含以下非最终成员,名为foo:
[INFO] def foo [E&lt;:javax.swing.JComponent with Runnable](arg:E):Unit
在Scala中是否有办法实现一个接口,该接口的方法需要一个实现另一个接口的类,而不需要在每个方法上编写整个类型?
答案 0 :(得分:4)
出现此错误是因为您已删除了type参数,因此删除了您尝试实现的方法的签名。然后,编译器会发现您尚未实现相关的原始方法:
错误:类ScalaIntersection需要是抽象的,因为类型为[E&lt ;:javax.swing.JComponent with Runnable](arg:E)Unit的trait JavaIntersection中的方法foo未定义
您无法真正使用类型别名删除两者长类型名称和该类型为上限的方法的类型参数(至少没有那种语法)。相反,将类型别名与交集类型完全相同。我没有看到完全丢失类型参数的方法,因为您实施的方法需要它。
class ScalaIntersection extends JavaIntersection {
type RunnableComponent = JComponent with Runnable
override def foo[E <: RunnableComponent](arg: E): Unit = ???
}