当前位置: 首页 > 知识库问答 >
问题:

覆盖Scala中的泛型特征方法

夹谷和韵
2023-03-14

我定义了一个通用的环境特征:

trait Environment[T]

为此,我提供了以下实现:

class MyEnvironment extends Environment[Integer] {
 val specific: Integer = 0
}

此外,我定义了一个通用事件特征,该特征具有一个接受通用环境作为参数的方法:

trait Event[T] {
  def exec(e: Environment[T])
}

对于这个事件特征,我提供了以下实现,其中exec()方法接受MyEnvironment类型的参数,使我能够访问MyEnvironment的特定值。

class MyEvent extends Event[Integer] {
  override def exec(e: MyEnvironment): Unit = {
    println(e.specific)
  }
}

然而,Scala编译器输出了一个错误,从中可以看出MyEnvironment似乎没有被识别为环境[整数]:

错误:方法exec不覆盖任何内容。

注意:MyEvent类的超类包含以下非最终成员,命名为exec: def exec(t:main.vub.lidibm.test.环境[整数]):单位

有没有可能做到这一点,或者有没有模式可以绕过这个问题。

共有2个答案

颜志业
2023-03-14

因为重写在方法的参数类型中不是多态的。它与Java中的工作方式相同。在这个例子中,您所做的是在现实中重载该方法。也就是说,它们被视为不同的方法<重写方法名称,即名称、签名、类型必须相同。

卫飞鹏
2023-03-14

您不能缩小方法的签名范围;它不再是同一个方法了。在您的情况下,您不能覆盖

def exec(e: Environment[T]): Unit

具有

override def exec(e: MyEnvironment): Unit 

第二种方法比第一种方法更具体。它在概念上与使用deffoo(s:String)重写def foo(a:Any)相同。

如果希望它工作,则需要在两个签名中使用相同的类型(请注意,如果使用上界,例如T

 类似资料:
  • 看看这个代码。 愚蠢的Scala编译器在这里显示错误: 错误:(22, 39) 类型不匹配;找到: mix.type (底层类型 SomeMix) 必需: T with SomeMix 大小写混合: SomeMix = 它不理解表达式I匹配到在某种混合已经是类型T。好吧,让我们帮助他。更改代码: 现在,它同意一切都是正确的,但显示警告: 警告:(22,17)抽象类型模式T未选中,因为它已通过擦除大

  • 我想在我的android项目中自动转换视图。所以,我想重写 方法 方法但是java编译不允许这样做,但是重写的方法不会与父方法冲突,并且总是返回视图对象或其子对象。我发现了一些信息,java不允许用泛型方法重写非泛型方法,但我找不到解释。 http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ8

  • 我在覆盖接口中声明的方法时遇到了一些问题,该方法使用泛型参数作为其异常,并使用泛型作为其参数之一。为了说明,我编写了以下代码接口 通过javac运行,我得到 请注意,在接口中,metodoA和metodoB之间的唯一区别在于它们的参数。 为什么Implementadora(Implementadora)的metodoB(metodoB)(代码)不重写Interfaz(代码),但重写metodoB(

  • 我正在尝试理解使用以下代码得到的名称冲突错误: 错误消息: 错误:名称冲突:

  • 主要内容:实例,实例,特征构造顺序Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。 与接口不同的是,它还可以定义属性和方法的实现。 一般情况下Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承。 Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait,如下所示: 实例 trait Equal {   def isEq

  • Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。 与接口不同的是,它还可以定义属性和方法的实现。 一般情况下Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承。 Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait,如下所示: trait Equal { def isEqua