我使用scala来检查变量是否是使用以下函数的泛型类型的实例
def has[StructureType <: UnfoundStructure]
(implicit t: ClassTag[StructureType]): Boolean = {
println("HAS")
println(struct)
println(struct.isInstanceOf[Road])
println(classTag[StructureType].runtimeClass)
println(struct.isInstanceOf[StructureType])
struct.isInstanceOf[StructureType]
}
类Road扩展了UnfoundStructure但是当我调用[Road]的东西有一个City作为它的结构(UnfoundStructure的另一个孩子)时,它返回true!尽管struct.isInstanceOf [Road]返回false这是事实。这是函数的输出:
HAS
City name Test City at 26,7 //Custom toString of the City type
false //struct.isInstanceOf[Road]
class com.vogon101.game.structures.Road //The runtime class of StructureType
true //struct.isInstanceOf[StructureType]
这个功能在其他地方被称为道路结构,如果它被道路包围则可以资助:
if (tile.up.has[Road]) {/*Do stuff*/} //tile.up gets another tile above it
答案 0 :(得分:1)
在您的情况下,isInstance
的{{1}}方法可行。
t.runtimeClass
您不必在此处手动检查def has[StructureType <: UnfoundStructure]
(implicit t: ClassTag[StructureType]): Boolean = {
t.runtimeClass.isInstance(struct)
}
- null
的结果是null
符合规范。
答案 1 :(得分:0)
我花了很多时间玩这个,直到我读到编译器的输出。事实证明,通过擦除消除了检查问题。为了解决这个问题,我现在必须这样做,不优雅但是有效:
def has[StructureType <: UnfoundStructure](implicit t: ClassTag[StructureType]):Boolean = {
if (struct == null)
return false
if (struct.getClass==t.runtimeClass){ //Check if struct is the correct class, but get around erasure
true
}
else false
}
如果有人有更好的答案,我很乐意听到它!