(请注意这是实际问题的简化版本)
假设您有tag
,Int
需要以下列方式静态访问
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)。
那么如何获得这个值?
鉴于CustomTag扩展了Tag,您可以实现Tag特征并从中获取所需的信息,如:
class CustomTag(val irrelevantData:String, val irrelevantNumber:Int ) extends Tag {
override def customVersion: Int = 444
}
除了你需要在Usage
的ctor中使用它之前创建该类的实例,这实际上不应该是这样的,这实际上不会起作用。
您还可以创建一个伴侣对象,用于在Map [Class,Int]上注册Custom标签的每个版本,但是这个选项不是很好,因为您必须手动注册每个类,这是某种东西这很容易忘记。
以前的解决方案可以工作,除了它容易出错(很容易忘记注册自定义版本),我想有一种打字方式可以解决这个问题,但我无法想到它。我还想象当我搜索这个解决方案时,会缺少一些词汇/模式?
为了回应@Jasper-M,我需要能在所有子类上都有一个标签,但我不需要强制执行它。我想向用户建议,如果你需要的话,可以选择这样做。
欢迎提示:D