2014-05-14 67 views
0

如果我想避免isInstanceOf & asInstanceOf组合,而是要使用模式匹配,目的是避免在下面的例子中擦除问题的任何简单方式?我研究了一些答案,但他们似乎都使用清单和生成的代码看起来复杂得多的不良isInstanceOf & asInstanceOf组合。斯卡拉 - 对一个类型参数的模式匹配?

trait Comparable[A] extends Ordered[A] { 
    override def equals(that : Any) = 
    that match { 
     case that : A => compare(that) == 0 
     case _ => false 
    } 
} 

我在上面的代码的目标是建立一个单一的特点,对于==增加了实施和!=到有序比较。不过,我得到以下错误,因为被擦除:

warning: abstract type pattern A is unchecked since it is eliminated by erasure 
     case that : A => compare(that) == 0 

注:有关于这个问题在计算器上其他类似的问题,但接受的答案似乎使用清单,因此,我的问题 - 可这可以实现一个更简单的方法?

回答

1

没有,有没有简单的方法。 Manifest已被替换为ClassTagTypeTag,但没有任何简单的方法可以获得所需的ClassTag - 性状不能参数,并且equalsAny未被声明为隐含ClassTag,所以我们必须强制实现类为它提供:

import scala.reflect.ClassTag 

trait Comparable[A] extends Ordered[A] { 
    implicit def ct: ClassTag[A] 

    override def equals(that: Any) = 
    that match { 
     case that: A => compare(that) == 0 
     case _ => false 
    } 
} 

isInstanceOf也不会有帮助,它仍然需要ClassTag

+0

你说的意思是“在任何等于被宣布采取隐式ClassTag”?它只需要一个“任何”。 –

+0

@AlexeyRomanov我的意思是“不” – wingedsubmariner