给定一个具体的类Animal,如何定义一个只接受其子类的函数Animal?
在这样的典型示例中,这Animal是一个特征,因此定义[A <: Animal]意味着您已经传递了 的子类Animal。但是,在像下面这样的场景中,哪里Animal是具体的,我可以将其排除为允许的类型吗?
我正在使用现有的生成代码,这只是问题的一般示例。因此,这意味着我无法将Animal(或等效物)制作成trait.
请参阅下面的示例:
class Animal {
def name: String = "General Animal"
}
class Dog extends Animal {
override def name: String = "Dog"
}
// How do I limit A to be a subtype of Animal (excluding Animal itself)?
class SpecificAnimalContainer[A <: Animal](a: A) {
def specificAnimal: A = a
}
val dogContainer = new SpecificAnimalContainer[Dog](new Dog)
// I do not want this to be able to compile.
val animalContainer = new SpecificAnimalContainer[Animal](new Animal)
Run Code Online (Sandbox Code Playgroud)
使用 Shapeless 你可以写:
import shapeless._
class SpecificAnimalContainer[A <: Animal](a: A)(implicit ev: A =:!= Animal) {
def specificAnimal: A = a
}
// val animalContainer = new SpecificAnimalContainer[Animal](new Animal)// doesn't compile
Run Code Online (Sandbox Code Playgroud)
否则,您可以自己为隐式实现类似的类型。
| 归档时间: |
|
| 查看次数: |
601 次 |
| 最近记录: |