我有以下代码:
class IncidentTag: def __init__(self,tag): self.tag = tag def equals(self,obj): return self.tag.equals(obj.tag) def hashCode(self): return self.tag.hashCode() from java.lang import String from java.util import HashMap from java.util import HashSet tag1 = IncidentTag(String("email")) tag1copy = IncidentTag(String("email")) tag2 = IncidentTag(String("notemail")) print tag1.equals(tag1copy) print tag2.equals(tag2) print "Now with HashSet:" hSet = HashSet() hSet.add(tag1) hSet.add(tag2) print hSet.contains(tag1) print hSet.contains(tag2) print hSet.contains(tag1copy)
输出为:1 1现在使用HashSet:1 1 0
但是,我原本期望最后一行也是真的(1).是否有一些我不知道的明显事物.
(是的,我知道我的equals方法和hashcode方法没有考虑到一些问题...它们是故意简单的,但如果问题导致这个问题,请告诉我)
您不应该实现Java样式的equals和hashCode方法,而是实现Python等效项__eq__
和__hash__
.添加
def __hash__(self): return self.hashCode() def __eq__(self, o): return self.equals(o)
帮助.这些python方法 - 据我所知 - 通过Jython动态绑定到hashCode和equals().这确保您可以将Python类放入Java的集合中.
现在代码打印五个"1".