Scala 如何具体设置抽象类型与类型绑定?
我试图使用case对象的类型作为抽象类型。我惊讶地看到下面编译的(类似)代码: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
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 }
^