【问题标题】:Confusion over the actual type of a referenced abstract type对引用的抽象类型的实际类型感到困惑
【发布时间】:2017-01-04 02:53:06
【问题描述】:

下面我有一个故意复杂的 Hello World 应用程序,我终其一生都无法弄清楚为什么 buildAndRun2 方法无法编译。

abstract class BaseFactoryOf[A]{
    type TheType
    def make: TheType
}

abstract class FactoryOf[A] extends BaseFactoryOf[A]{
    final type TheType = A
}

class HelloWorld {
    def execute: String = "Hello World!"
}

class HelloWorldFactory extends FactoryOf[HelloWorld] {
    def make: TheType = new HelloWorld
}

def buildAndRun1[T <: BaseFactoryOf[_],B](factory: T)(f: T#TheType => B): B ={
    f(factory.make)
}

def buildAndRun2[T <: FactoryOf[_],B](factory: T)(f: T#TheType => B): B ={
    f(factory.make)
} //This doesn't compile due to a type mismatch error. But Why?!

//Client Code
buildAndRun1(new HelloWorldFactory)(i => i.execute) // This Works!
buildAndRun2(new HelloWorldFactory)(i => i.execute) // Epic Fail!

无用的中级FactoryOf[A]其实是为了介绍问题而写的。我很确定这与type TheType 有关,但它是什么?!如果有的话,它是无用的中间 FactoryOf 类,它允许我验证 type TheTypeA 相同,所以按照这个逻辑,我应该更有信心使用 buildAndRun2 方法。

【问题讨论】:

    标签: scala types type-alias


    【解决方案1】:

    试试

    def buildAndRun3[T <: FactoryOf[_],B](factory: T)(f: factory.TheType => B): B = {
        f(factory.make)
    }
    

    我怀疑TheType 是在FactoryOf 类型中定义的,以依赖于参数。这就是为什么实际类型取决于给定的实际实例(路径相关类型)而不仅仅是类型。

    另一方面,buildAndRun1 可以编译,因为TheType 没有在类型BaseFactoryOf 中定义,它应该在另一个类型T 中定义,这是一个后代。它可以被定义为持久的东西,比如Int

    【讨论】:

    • 我不知道我可以使用factory.TheType 表达式。 tnx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多