可以说我有一些密封类Scala的方法取决于类型的密封参数
sealed abstract class SomeEnumThing {
type RenderedType
}
object Type1 extends SomeEnumThing {
type RenderedType = String
}
object Type2 extends SomeEnumThing {
type RenderedType = Array[Byte]
}
而且我想的方法基于传入的参数定义的抽象类型返回,如
def render(something : SomeEnumThing) : something.RenderedType = { .... }
这是什么正确的语法。这甚至是可能的,我认为这与2.10方法相关的类型有关。
编辑:更新了例
sealed abstract class SomeThing {
type RenderedType
}
object Type1 extends SomeThing {
type RenderedType = String
}
object Type2 extends SomeThing {
type RenderedType = Long
}
def render(something : SomeThing) : something.RenderedType =
something match {
case Type1 => "test"
case Type2 => 0l
}
你的问题是,你想要案例匹配来介绍新型知识,它并没有在你的情况。使用GADT和依赖类型时,这可能很容易发生,但在您的情况下不会发生。幸运的是,Scala支持GADT的一个相当绝对的概念,并且你的类型同构于一个类型,所以你可以改变你的'SomeThing'到'SomeThing [A]'并且'Type1 extends SomeThing [String]'并且'Type2 extends SomeThing [龙]'。然后用'render [A](something:SomeThing [A]):你的大小写块就会起作用。 – 2013-04-24 21:55:52
因此,你的意思是编译器不会确定Type1中唯一可能的返回值是一个字符串,这恰好是该情况下RenderedType的值。它可以,如果它足够聪明,但Scala编译器还没有。 – monkjack 2013-04-24 22:05:56
是的,它是那些想要做的更“依赖”的事情之一。在我的例子中,案例匹配是有效的,但我并不太相信它的实现(如果你将两个类型变量平等,例如,它不能正确工作,或者如果你对精化类型变量有差异注释) 。如果你真的想开始做这样的事情,你可能需要将你的代码从头开始,并在'SomeThing'上定义消费/消除函数。 – 2013-04-24 22:09:15