我很难理解如何使用清单。
这是我的问题: 我创建了一个新的参数化类C并尝试覆盖这样的等于:
override def equals(that:Any)=that match{
case that:C[T] => true /*do smth else not relevant*/
case _ => false
}
当然我收到了“警告:类型模式C [T]中的非变量类型参数T未被选中,因为它被擦除”。我尝试使用像我在许多其他功能中使用的清单一样:
override def equals(that:Any)(implicit manifest:Manifest[T])=that match{
case that:C[T] => true
case _ => false
}
但是我收到了“错误:方法等于覆盖任何内容”消息。
我不知道如何解决这个问题。有人可以帮帮我吗?
答案 0 :(得分:5)
你无法解决它。欢迎来到与java顺利互操作的乐趣。从def equals(x: Any): Boolean
改进等于的唯一方法是编写不同的方法。
我总是试图说服马丁,我们应该以不同的方式实现== desugaring,目标是“def decentEquals [T](x:T)(隐式等价:Equiv [T])”,默认含义和桥接除非你关心,否则让它无缝化的方法,但他认为相等测试不应该变慢。
答案 1 :(得分:4)
只是 @exmpmpore 的答案的附件;完全可以编写 null-safe 等于可能类型安全的方法。请查看Scalaz Identity
(and examples)
new Fruit ≠ new Orange //does not compile
new Apple ≟ new Apple //compiles!
基于类型,它还需要任何参数化(即C[T] == C[U] iff T =:= U
当然,试图覆盖方法的问题是:
def foo(bar : Bar) : Baz
有了这个:
def foo(bar : Bar) ( implicit bat : Bat) : Baz
这是这不构成重写。因为该方法具有不同的签名,所以您已经重载该方法。这就是为什么scala需要override
修饰符很好:否则你可能没有注意到代码没有按照你的想法做到!
答案 2 :(得分:-1)
override def equals(that:Any)= {
that match{
case that:C[x] => true
case _ => false
}
}
会编译,但我不认为它能做你想要的。你试图看看类型参数是否匹配(我假设),但我不知道你是如何(或者如果)那样做的。 (编辑:阅读更多的文献,我认为你不能。出于显而易见的原因,你不能用清单意识的功能覆盖非清单意识功能。)