gpt4 book ai didi

scala - 我可以使用绑定(bind)在 Scala 抽象方法上的类型,然后使用 "tighten up"子类中的定义吗?

转载 作者:行者123 更新时间:2023-12-04 19:52:01 24 4
gpt4 key购买 nike

基本上我想做这样的事情:

class Shape

class CoordSystem
class C3D(val x: Double, y: Double, z: Double) extends CoordSystem
class C2D(val x: Double, y: Double) extends CoordSystem

abstract class Shape {
def getCoords[C <: CoordSystem]: List[C]
}

class Pyramid extends Shape {
def getCoords: List[C3D] =
List(new C3D(1,2,1), new C3D(1,1,1), new C3D(2,2,1), new C3D(2,1,1), new C3D(1.5,1.5,3))
}
>> error: class Pyramid needs to be abstract, since method getCoords in class Shape of type [C <: CoordSystem]List[C] is not defined

我在 this answer 上看到了一些不同的想法,但它们似乎都不适合这种情况 - 因为它们似乎不允许我在其他地方编写引用 myShape.getCoords 的代码,就好像它已在 Shape< 中正确定义一样 子类,返回 CoordSystem 子类的对象列表。

我还找到了an interesting discussion about generics在 Scala Lang 电子邮件列表中,但不能完全将其与我的情况联系起来。

感谢任何帮助!

最佳答案

这样的事情怎么样:

class CoordSystem
class C3D(val x: Double, y: Double, z: Double) extends CoordSystem
class C2D(val x: Double, y: Double) extends CoordSystem

trait ShapeLike[+C <: CoordSystem] {
def getCoords: List[C]
}

abstract class Shape extends ShapeLike[CoordSystem]

class Pyramid extends Shape with ShapeLike[C3D] {
def getCoords: List[C3D] =
List(new C3D(1, 2, 1), new C3D(1, 1, 1), new C3D(2, 2, 1), new C3D(2, 1, 1), new C3D(1.5, 1.5, 3))
}

当然,没有什么会强制您声明额外的类型 ShapeLike 来执行此操作;它的目的是允许您使用 Shape 类型,而无需烦人的额外类型参数。

因此,实际上,如标题所述,您的问题的答案是:如果在父类(super class)中将类型参数定义为协变类型参数,则您可以“收紧”子类中类型参数的类型绑定(bind);相反,您可以“放松”逆变类型参数的类型限制。

关于scala - 我可以使用绑定(bind)在 Scala 抽象方法上的类型,然后使用 "tighten up"子类中的定义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7666759/

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