Scala 如何具体设置抽象类型与类型绑定?

Scala 如何具体设置抽象类型与类型绑定?,scala,types,Scala,Types,我试图使用case对象的类型作为抽象类型。我惊讶地看到下面编译的(类似)代码: sealed abstract class Bar case object BarOne extends Bar case object BarTwo extends Bar sealed abstract class Foo { type A <: Bar def f: A } object Foo { object FooOne extends Foo { type A = B

我试图使用case对象的类型作为抽象类型。我惊讶地看到下面编译的(类似)代码:

sealed abstract class Bar

case object BarOne extends Bar

case object BarTwo extends Bar

sealed abstract class Foo {
  type A <: Bar

  def f: A
}

object Foo {
  object FooOne extends Foo {
    type A = BarOne.type
    val f = BarTwo
  }

  object FooTwo extends Foo {
    type A = BarTwo.type
    val f = BarOne
  }
}
密封抽象类栏
case对象BarOne扩展条
案例对象BarTwo扩展条
密封抽象类Foo{

键入A我不知道这里发生了什么,但我确实将问题隔离了一点。此外,它可以与Foo子类以及对象一起工作。我已确认这在scalac 2.11.8上编译:

object BarOne
object BarTwo

abstract class Foo[A] {
  def attributeType: A
}

object FooContainer {
  class FooOne extends Foo[BarOne.type] {
    val attributeType = BarTwo
  }

  object FooTwo extends Foo[BarOne.type] {
    val attributeType = BarOne
  }
}

  • A在f:A中被解释为A有人建议您升级到现代版本的Scala吗?(笑话)

    关于重写的错误为类型提供了一个很好的路径

    $ scala
    Welcome to Scala 2.12.0-M5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92).
    Type in expressions for evaluation. Or try :help.
    
    scala> :pa
    // Entering paste mode (ctrl-D to finish)
    
    sealed abstract class Bar
    
    case object BarOne extends Bar
    
    case object BarTwo extends Bar
    
    sealed abstract class Foo {
      type A <: Bar
    
      def f: A
    }
    
    object Foo {
      object FooOne extends Foo {
        type A = BarOne.type
        val f = BarTwo
      }
    
      object FooTwo extends Foo {
        type A = BarTwo.type
        val f = BarOne
      }
    }
    
    // Exiting paste mode, now interpreting.
    
    <console>:26: error: overriding method f in class Foo of type => Foo.FooOne.A;
     value f has incompatible type
               val f = BarTwo
                   ^
    <console>:31: error: overriding method f in class Foo of type => Foo.FooTwo.A;
     value f has incompatible type
               val f = BarOne
                   ^
    

    FooOne
    FooTwo
    上缺少的
    extensed Foo
    是一个输入错误吗?因为如果您添加它,它就不会编译。@EndeNeu这是一个疏忽。您是对的,它不会编译(如预期的那样)。我已经更新了这个问题,使它看起来尽可能接近真实的代码。当然,这没有用,因为上面的代码没有编译,我的代码也编译了。@muhuk如果上面的代码没有编译,那么它就不代表你的编译代码。除非你得到一个正确的最小示例,否则这个问题无法回答。好的。现在,上面的代码是does编译,据我所知,它不应该编译。这一定是一个bug。谢谢。但这不是答案。是的,我不知道如何在堆栈溢出上获得一个大的代码片段。
    $ scala
    Welcome to Scala 2.12.0-M5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92).
    Type in expressions for evaluation. Or try :help.
    
    scala> :pa
    // Entering paste mode (ctrl-D to finish)
    
    sealed abstract class Bar
    
    case object BarOne extends Bar
    
    case object BarTwo extends Bar
    
    sealed abstract class Foo {
      type A <: Bar
    
      def f: A
    }
    
    object Foo {
      object FooOne extends Foo {
        type A = BarOne.type
        val f = BarTwo
      }
    
      object FooTwo extends Foo {
        type A = BarTwo.type
        val f = BarOne
      }
    }
    
    // Exiting paste mode, now interpreting.
    
    <console>:26: error: overriding method f in class Foo of type => Foo.FooOne.A;
     value f has incompatible type
               val f = BarTwo
                   ^
    <console>:31: error: overriding method f in class Foo of type => Foo.FooTwo.A;
     value f has incompatible type
               val f = BarOne
                   ^
    
    $ scala
    Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92).
    Type in expressions for evaluation. Or try :help.
    
    scala> object X ; object Y
    defined object X
    defined object Y
    
    scala> class C { def f: X.type = X }
    defined class C
    
    scala> class D extends C { override def f: Y.type = Y }
    defined class D
    
    scala> :quit
    $ scalam
    Welcome to Scala 2.12.0-M5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92).
    Type in expressions for evaluation. Or try :help.
    
    scala> scala> object X ; object Y
    
    // Detected repl transcript. Paste more, or ctrl-D to finish.
    
    defined object X
    defined object Y
    
    scala> class C { def f: X.type = X }
    defined class C
    
    scala> class D extends C { override def f: Y.type = Y }
    defined class D
    // Replaying 3 commands from transcript.
    
    scala> object X ; object Y
    defined object X
    defined object Y
    
    scala> class C { def f: X.type = X }
    defined class C
    
    scala> class D extends C { override def f: Y.type = Y }
    <console>:13: error: overriding method f in class C of type => X.type;
     method f has incompatible type
           class D extends C { override def f: Y.type = Y }
                                            ^