gpt4 book ai didi

斯卡拉 : generics and variable inheritance issue

转载 作者:行者123 更新时间:2023-12-02 01:10:58 24 4
gpt4 key购买 nike

我有一个奇怪的问题,可能是因为我的类的结构有点复杂,但无论如何:

所以首先我有 2 个抽象类:TestAbstract1 和 TestAbstract2。

  • TestAbstract2 采用扩展 TestAbstract1 的类型
  • TestAbstract1 声明了一个类型为 TestAbstract2[TestAbstract1] 的名为 valTest 的 val,它必须在子类中实现

代码:

abstract class TestAbstract1 {
val valTest: TestAbstract2[TestAbstract1]

def meth1(): List[TestAbstract1] = {
valTest.meth2()
}
}

abstract class TestAbstract2[T <: TestAbstract1] {
def meth2(): List[T] = {
List()
}
}

然后我有一个扩展 TestAbstract2 的对象 TestObject2 和一个扩展 TestAbstract1 的基本类 Test2,并且必须实现 valTest :

class Test2 extends TestAbstract1 {
val valTest: TestAbstract2[Test2] = TestObject2
}

object TestObject2 extends TestAbstract2[Test2] { }

问题在这里:当我编译时,它告诉我:

[error] overriding value valTest in class TestAbstract1 of type models.test.TestAbstract2[models.test.TestAbstract1];

[error] value valTest has incompatible type

[error] val valTest: TestAbstract2[Test2] = TestObject2

我不知道我做错了什么,因为如果我考虑多态性规则,应该没问题......

你有什么想法吗?或者甚至是做我想做的事情的更好方法?

谢谢!

最佳答案

在您的示例中,TestAbstract2 不是协变的。这意味着即使我们有

Test2 <: TestAbstract1

事实并非如此:

TestAbstract2[Test2] <: TestAbstract2[TestAbstract1]

看看here如果这对您没有意义。

在您的示例中,Test2 中声明的 valTest 属于 TestAbstract2[Test2] 类型,但应为 TestAbstract2[TestAbstract1 ],因此错误。

您有以下选择:

  1. 声明 TestAbstract2 为协变:

    class TestAbstract2[+T <: TestAbstract1]
  2. 使用通配符类型声明 valTest:

    val valTest: TestAbstract2[_ <: TestAbstract1]
  3. 在内部 TestAbstract2 的类型上参数化 TestAbstract1:

    class TestAbstract1[T <: TestAbstract1[T]] {
    val valTest: TestAbstract2[T]
    // ...
    }

    Test2 更改为:

    class Test2 extends TestAbstract1[Test2]

请注意,在第三个示例中选择使用 F 有界多态性(通过 TestAbstract1 中的自身函数来限制 T)在这里有些随意。为了这个例子,我只需要输入一些类型,在你的例子中它有效(当查看 Test2 的定义时)。这三个版本中哪一个最适合您取决于您​​希望如何使用这些类。

如果这对您来说还不够,请在您的问题中提供更多详细信息,我们很乐意提供帮助。

关于斯卡拉 : generics and variable inheritance issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17375496/

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