Scala-抽象基类中的参数类型,可以扩展

将要

如何为抽象类中的方法提供参数,以便以后可以扩展该参数?我将在下面说明一个简单的场景。

abstract class Car {
  def drive(x: Driver)
}

abstract class Driver
case class DriverA(name: String) extends Driver
case class DriverB(name: String, age: Int) extends Driver

class Audi extends Car {
  // each child class should have a more specific type for param "x"
  def drive(x: DriverA) = { ... }
}

class BMW extends Car {
  // each child class should have a more specific type for param "x"
  def drive(x: DriverB) = { ... }
}

但这在Scala中不起作用:“错误:[..]方法参数类型必须完全匹配”

我也尝试指定像def drive [T <:Driver](x:T):Int这样的上限类型,但是仍然没有运气。似乎我缺少一些简单而明显的东西。

这样的设计有什么问题吗?

东阳

您可以在scala中使用抽象类型

scala> :paste
// Entering paste mode (ctrl-D to finish)

abstract class Car {
  type D <: Driver
  def drive(x: D): Unit
}
abstract class Driver
case class DriverA(name: String) extends Driver
case class DriverB(name: String) extends Driver
class Audi extends Car {
  type D = DriverA
  def drive(x: DriverA): Unit = println(x.name)
}

// Exiting paste mode, now interpreting.

defined class Car
defined class Driver
defined class DriverA
defined class DriverB
defined class Audi

scala> new Audi().drive(DriverA("test"))
test

或使用带有类型参数化的类:

scala> :paste
// Entering paste mode (ctrl-D to finish)

abstract class Driver
case class DriverA(name: String) extends Driver
abstract class Car[D <: Driver] {
  def drive(x: D): Unit
}
class Audi extends Car[DriverA] {
  def drive(x: DriverA) = println(x.name)
}

// Exiting paste mode, now interpreting.

scala> new Audi().drive(DriverA("zzz"))
zzz

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

(在Scala中)可以使用类的泛型类型参数来完成,而不能使用抽象类型成员来完成吗?

来自分类Dev

Scala Akka:使用子类型参数实现抽象类

来自分类Dev

Scala 中的抽象类型、变量和类型类

来自分类Dev

Scala:是否可以定义扩展其class参数的类?

来自分类Dev

Scala中具有构造函数参数的抽象类

来自分类Dev

Scala:如何在超类中引用扩展类的类型?

来自分类Dev

Scala擦除类类型参数

来自分类Dev

如何在Scala中反映与抽象类型的类型参数相对应的具体类型?

来自分类Dev

Scala错误:扩展功能缺少参数类型

来自分类Dev

Scala缺少扩展功能的参数类型

来自分类Dev

scala3扩展方法类型参数

来自分类Dev

使Scala类使用宏扩展特征/抽象类

来自分类Dev

Scala:使用类型参数或抽象类型作为类型界限

来自分类Dev

扩展类时Scala类型冲突

来自分类Dev

如何在Scala中访问类的类型参数

来自分类Dev

在Scala中访问类型参数的类级值

来自分类Dev

Scala:类型参数中的问号

来自分类Dev

参数类型的scala中的咖喱

来自分类Dev

Scala中类型类的性能

来自分类Dev

Scala中的类型类API

来自分类Dev

在Scala中,是否可以“ curry”定义类型的参数?

来自分类Dev

在Scala中实现抽象类

来自分类Dev

(Scala)如何扩展抽象类的apply方法?

来自分类Dev

Scala类扩展{}

来自分类Dev

Scala类型参数和案例类

来自分类Dev

为什么在scala中无法在实现的基类中提供抽象重写方法的实现

来自分类Dev

Scala:在隐式参数中抽象依赖于路径的类型

来自分类Dev

Scala中的隐式抽象类构造函数参数和继承

来自分类Dev

Scala-抽象类型和隐式参数解析

Related 相关文章

热门标签

归档