【问题标题】:Intersection type with type definition具有类型定义的交集类型
【发布时间】:2015-10-07 20:39:27
【问题描述】:

我有一个 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 <: javax.swing.jcomponent with runnable e trait javaintersection foo>

错误:方法 foo 没有覆盖任何内容。
[INFO] 注意:ScalaIntersection 类的超类包含以下名为 foo 的非最终成员:
[INFO] def foo[E <: javax.swing.jcomponent with runnable e unit>

在 Scala 中有没有一种方法可以实现一个接口,其方法采用一个实现另一个接口的类,而不需要在每个方法上编写整个类型?

【问题讨论】:

    标签: java scala inheritance types interface


    【解决方案1】:

    出现此错误是因为您已删除类型参数,因此您尝试实现的方法的签名也已删除。然后编译器会看到你没有实现有问题的原始方法:

    错误:ScalaIntersection 类需要抽象,因为类型 [E <: javax.swing.jcomponent with runnable e trait javaintersection foo>

    您不能真正使用类型别名来删除 长类型名称 该类型是其上限的方法的类型参数(至少不是那种语法)。相反,使类型别名与交集类型完全一致。我看不到完全丢失类型参数的方法,因为您正在实现的方法需要它。

    class ScalaIntersection extends JavaIntersection {
      type RunnableComponent = JComponent with Runnable
      override def foo[E <: RunnableComponent](arg: E): Unit = ???
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-03
      • 2021-04-09
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多