Scala通用函数isInstanceOf [T]不起作用

时间:2016-01-02 19:06:26

标签: scala generics

我使用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

2 个答案:

答案 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
}

如果有人有更好的答案,我很乐意听到它!