Scala类型标签和类型别名

都灵

如果我在类中有类型别名定义,我可以在运行时将其与静态已知的类型或其他类型别名进行比较吗?考虑:

type ConsArguments = (Option[Long], String, Option[String], Iterable[Input])
trait Type {
    val name :String
    type Value
    def apply(id :Option[Long], name :String, label :Option[String], inputs :Iterable[Input]=Iterable()) :Statistic
}
class BaseType[V :TypeTag](val name :String, constructor :((ConsArguments)) => Statistic {type Value=V}) extends Type{
    type Value = V
    def apply(id :Option[Long], name :String, label :Option[String], inputs :Iterable[Input]=Iterable()) :Statistic{type Value=V} =
        constructor((id, name, label, SortedSet[Input]()(Input.nameOrdering)++inputs))
}
val LongValued = new BaseType[Long]("long", (LongStatistic.apply _).tupled)
val lv :Type = LongValued
println("type of LongValued: "+universe.typeOf[LongValued.Value]+" is Long? "+(universe.typeOf[LongValued.Value]=:=universe.typeOf[Long]))
println("type of lv: "+universe.typeOf[lv.Value]+" is Long? "+(universe.typeOf[lv.Value]=:=universe.typeOf[Long]))

第一个比较为true,第二个为false。我能以某种方式解决它吗?通常,我将有更多的“类型”实例充当域模型中类的构造函数,并希望遍历这些类型的集合并选择一个匹配的实例。

都灵

好的,我知道了。更改非常简单:

type ConsArguments = (Option[Long], String, Option[String], Iterable[Input])
trait Type {
    val name :String
    type Value
    val tpe :universe.Type
    def apply(id :Option[Long], name :String, label :Option[String], inputs :Iterable[Input]=Iterable()) :Statistic
}
class BaseType[V :TypeTag](val name :String, constructor :((ConsArguments)) => Statistic {type Value=V}) extends Type{
    type Value = V
    val tpe = typeOf[V]
    def apply(id :Option[Long], name :String, label :Option[String], inputs :Iterable[Input]=Iterable()) :Statistic{type Value=V} =
        constructor((id, name, label, SortedSet[Input]()(Input.nameOrdering)++inputs))
}
val LongValued = new BaseType[Long]("long", (LongStatistic.apply _).tupled)
val lv :Type = LongValued
println("type of lv: "+lv.tpe+" is Long? "+(lv.tpe=:=universe.typeOf[Long]))

尽管如此,在整个代码中都使用double(类型...和val _:Type)声明还是有点令人讨厌。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Scala类型别名和方法重载

来自分类Dev

Scala中的类型别名

来自分类Dev

Scala 中的类型别名

来自分类Dev

类型别名和类似类型

来自分类Dev

从Scala中的类型别名创建对象

来自分类Dev

Scala类型别名与伴随对象

来自分类Dev

Scala类型别名的命名规则?

来自分类Dev

对象中的Scala类型别名

来自分类Dev

如何从类型别名提取类型实参和类型参数引用其他类型别名?

来自分类Dev

如何从类型别名提取类型实参和类型参数引用其他类型别名?

来自分类Dev

类型别名和NewType之间的区别

来自分类Dev

Scala:从mixin类型别名继承时,“类类型是必需的,但找到了{trait}和{trait}”

来自分类Dev

类型别名错误

来自分类Dev

具有类型参数的Scala类型别名

来自分类Dev

Scala类型别名破坏了类型兼容性

来自分类Dev

> 2个类型参数的Scala中缀类型别名?

来自分类Dev

Scala类型别名破坏了类型兼容性

来自分类Dev

类型别名与类型相同

来自分类常见问题

类型和类型别名之间的Elm差异?

来自分类Dev

使用类型别名和清单的Scala 2.11.5编译器崩溃

来自分类Dev

避免在Scala类和同伴对象中使用重复的类型别名

来自分类Dev

为什么此类型别名无法编译(Scala)

来自分类Dev

Typeof / instanceof类型别名

来自分类Dev

std :: bind与类型别名

来自分类Dev

Rust中的类型别名

来自分类Dev

快速扩展类型别名

来自分类Dev

类型别名的伴随对象

来自分类Dev

条件类型别名定义

来自分类Dev

如何创建类型别名