是否有可能实现类型推断?(Is it possible to achieve class type inference?)
考虑以下代码(不可编译):
trait Entity { type T <: Reality def liveIn: Option[Class[_ <: Unit#T]] } abstract class World extends Entity { def liveIn = None } class Universe extends World { type T = Real.type } class ParallelUniverse extends World { type T = Unreal.type } abstract class Humanoid { def liveIn = Some(classOf[World#T]) } class Human extends Humanoid { type T = Real.type } class Alien extends Humanoid { type T = Unreal.type } sealed trait Reality case object Real extends Reality case object Unreal extends Reality有可能推断或以某种方式隐式地将具体类实例放在Some(classOf [???])?
Consider following code (which not compilable):
trait Entity { type T <: Reality def liveIn: Option[Class[_ <: Unit#T]] } abstract class World extends Entity { def liveIn = None } class Universe extends World { type T = Real.type } class ParallelUniverse extends World { type T = Unreal.type } abstract class Humanoid { def liveIn = Some(classOf[World#T]) } class Human extends Humanoid { type T = Real.type } class Alien extends Humanoid { type T = Unreal.type } sealed trait Reality case object Real extends Reality case object Unreal extends RealityIs it possible to infer or somehow implicitly place concrete class instance at Some(classOf[???])?
最满意答案
似乎我的问题以其他方式解决了:
trait Entity[T <: Reality] { def liveIn: Option[Class[_ <: Entity[T]]] } abstract class World[T <: Reality] extends Entity[T] { def liveIn = None } class Universe extends World[Real.type] class ParallelUniverse extends World[Unreal.type] abstract class Humanoid[T <: Reality] extends Entity[T] { def liveIn = Some(classOf[World[T]]) } class Human extends Humanoid[Real.type] class Alien extends Humanoid[Unreal.type] sealed trait Reality case object Real extends Reality case object Unreal extends RealitySeems my problem solved in other way:
trait Entity[T <: Reality] { def liveIn: Option[Class[_ <: Entity[T]]] } abstract class World[T <: Reality] extends Entity[T] { def liveIn = None } class Universe extends World[Real.type] class ParallelUniverse extends World[Unreal.type] abstract class Humanoid[T <: Reality] extends Entity[T] { def liveIn = Some(classOf[World[T]]) } class Human extends Humanoid[Real.type] class Alien extends Humanoid[Unreal.type] sealed trait Reality case object Real extends Reality case object Unreal extends Reality更多推荐
发布评论