交叉类型与类型定义

时间:2015-07-18 03:20:36

标签: java scala inheritance types interface

我有一个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中是否有办法实现一个接口,该接口的方法需要一个实现另一个接口的类,而不需要在每个方法上编写整个类型?

1 个答案:

答案 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 = ???
}