在Scala中,如何定义不包含已定义类的类型上限?
给定一个具体的类在Scala中,如何定义不包含已定义类的类型上限?,scala,types,Scala,Types,给定一个具体的类Animal,如何定义一个只接受Animal子类的函数 在像这样的典型例子中,动物是一种特性,所以定义动物的目的有点不清楚,但是你的问题看起来就像Scala文档中的一本书 抽象类Pet扩展动物{} 类PetContainer[P使用shapeless可以编写: import shapeless._ class SpecificAnimalContainer[A <: Animal](a: A)(implicit ev: A =:!= Animal) { def sp
Animal
,如何定义一个只接受Animal
子类的函数
在像这样的典型例子中,动物是一种特性,所以定义动物的目的有点不清楚,但是你的问题看起来就像Scala文档中的一本书
抽象类Pet扩展动物{}
类PetContainer[P使用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
导入无形状_
类特定的AnimalContainer[A Make animal Atrait
。然后你就不能实例化animal
。问题解决了。事实上,没有动物,只有狗和猫等等。@ziggystar-huh?什么阻碍你实例化一个trait?O_O?你正在实例化函数[X,Y]
每天上千次…@ziggystar我提到“我正在使用现有的生成代码”,因此我不能将动物
变成一种特征“我不能将动物变成一种特征”与“我正在使用现有的生成代码”完全不同,因为“生成代码”这可能意味着什么。是你生成的吗?然后调整生成器。或者在你的构建中添加一些生成后预编译过程源。这是一个完全不同的问题。至少有两个人认为你可以按照自己的意愿声明类型(例如,作为一种特征),所以我不明白为什么我的答案值得投反对票。我不喜欢因为无法跟上移动目标问题而被投反对票,对不起。如果问题令人困惑,对不起。这就是我添加澄清的原因。我很高兴接受不同的回答,即使这只是解释为什么在Scala中这可能不可能的回答。公平地说,y你仍然没有直接回答这个问题。虽然你的解决方案使动物
类无法实例化,但它没有明确告诉我如何创建一个只接受动物
严格子类型的方法(不包括动物
本身)。也许这个答案作为注释会更好。是的,我的代码是在这之后建模的,但有一个很大的区别。我在上界中使用的类型不是抽象的,我想确保不能传入它的实例。在我的示例中,关键是“如何将A限制为动物的子类型(不包括动物本身)?”然而,@Dmytro的另一个答案似乎回答了这个问题。
abstract class Pet extends Animal {}
class PetContainer[P <: Pet](p: P) {
def pet: P = p
}
class Lion extends Animal {
override def name: String = "Lion"
}
// val lionContainer = new PetContainer[Lion](new Lion)
// ^this would not compile
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