【发布时间】:2018-02-04 00:13:07
【问题描述】:
给定一个具体的类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)
【问题讨论】:
-
将动物设为
trait。那么你就不能实例化Animal。问题解决了。实际上,没有动物,只有狗和猫等等。 -
@ziggystar 嗯?是什么阻碍了你实例化一个特征? o_o?你每天都在实例化
Function[X, Y]千次...... -
@ziggystar 我提到“我正在使用现有的生成代码”,因此我不能将
Animal变成特征 -
“我不能把 Animal 变成一个 trait”绝不是从“我正在使用现有的生成代码”中得出的,因为“生成的代码”可能意味着任何东西。是你制造的吗?然后调整生成器。或者在您的构建中添加一些生成后预编译过程源步骤。这是一个完全不同的问题。并且至少有两个人认为您可以随意声明您的类型(例如,作为一种特征),所以我不明白为什么我的回答值得一票。我不喜欢因为无法赶上移动目标问题而被否决,抱歉。
-
对不起,如果问题令人困惑。这就是我添加说明的原因。我很高兴接受不同的回应,即使这只是解释为什么在 Scala 中这可能是不可能的。公平地说,你仍然没有直接回答这个问题。虽然您的解决方案无法实例化
Animal类,但它并没有具体向我展示如何使用一种只接受Animal的严格子类型(不包括Animal本身)的方法。