在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 A
trait
。然后你就不能实例化
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