将任何参数化对象作为类构造函数的参数

时间:2012-04-19 21:27:52

标签: scala constructor parameterized

说我有这样的代码:

abstract class Animal[T <: Animal[T]] {
  def mateWith(that: T)
}

class Cow extends Animal[Cow] {
  override def mateWith(that: Cow) { println("cow") }
}

class Dog extends Animal[Dog] {
  override def mateWith(that: Dog) { println("dog") }
}

我想写这样的东西:

class Caretaker (val pet: Animal) {
  ...
}

但这是无效的,因为Animal需要参数化。我可以通过参数化看守来解决这个问题:

class Caretaker[T <: Animal[T]](val pet: Animal[T]) {
  ...
}

但这对我正在做的事情来说真的没必要。

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

class Caretaker(val pet: Animal[_]) {
    ...
}

答案 1 :(得分:0)

请注意,如果您希望看护人​​照顾两只可以互相交配的宠物,那么参数就会变得很重要

class Caretaker[T <: Animal[T]](val pet1: T, val pet2: Animal[T]) {
  matePets = pet2.mateWith(pet1)
}