Scala - 执行值

时间:2017-02-21 19:27:22

标签: scala

(请注意这是实际问题的简化版本)

假设您有tagInt需要以下列方式静态访问

class Usage[T: universe.TypeTag](tag: Int) = {
    // use the tag in this class
    def realActualUsage(thingToBeSaved:T): Unit = { //...do stuff here 
       }
}

trait Tag {
    val customTag : Int 
}

class CustomTag(val irrelevantData:String, val irrelevantNumber:Int ) extends Tag

val useThis = new Usage[CustomTag](???) // <-- this is where I need my tag

// much later
useThis.realActualUsage(new CustomTag("Bla", 4))

如你所见,有一个???应该去tag(一个Int)。 那么如何获得这个值?

选项1

鉴于CustomTag扩展了Tag,您可以实现Tag特征并从中获取所需的信息,如:

class CustomTag(val irrelevantData:String, val irrelevantNumber:Int ) extends Tag {
   override def customVersion: Int = 444
}

除了你需要在Usage的ctor中使用它之前创建该类的实例,这实际上不应该是这样的,这实际上不会起作用。

选项2

您还可以创建一个伴侣对象,用于在Map [Class,Int]上注册Custom标签的每个版本,但是这个选项不是很好,因为您必须手动注册每个类,这是某种东西这很容易忘记。

其他选项

以前的解决方案可以工作,除了它容易出错(很容易忘记注册自定义版本),我想有一种打字方式可以解决这个问题,但我无法想到它。我还想象当我搜索这个解决方案时,会缺少一些词汇/模式?

为了回应@Jasper-M,我需要在所有子类上都有一个标签,但我不需要强制执行它。我想向用户建议,如果你需要的话,可以选择这样做。

欢迎提示:D

0 个答案:

没有答案