gpt4 book ai didi

scala - 在 Scala 中,我如何定义不包括已定义类的类型上限?

转载 作者:行者123 更新时间:2023-12-05 03:07:00 25 4
gpt4 key购买 nike

给定一个具体类 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)

最佳答案

使用 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

否则你可以自己实现类似的隐式类型。

Type constraint for type inequality in scala

Enforce type difference

How can I have a negation type in Scala?

关于scala - 在 Scala 中,我如何定义不包括已定义类的类型上限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48590195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com