2012-04-19 152 views
1

说我有这样的代码:以任何参数对象作为参数传递给类构造函数

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) { 
    ... 
} 

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

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

,但是这是我在做什么真的不必要。

有没有更好的方法来做到这一点?

回答

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

是什么下划线意味着成为重要?任何有效的参数化类型的动物? – 2012-04-19 21:42:10

+0

就我对scala的了解而言,下划线是一个通配符,在本质上意味着“我不在乎这里发生了什么”。对Animal类的参数化的限制会限制哪些类型可以有效地传递给Caretaker类。 – Steven 2012-04-19 21:45:25

0

请注意,如果你想有一个看守照顾两只宠物,可以相互配合,则该参数将

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