栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么我不应该在继承中使用平等?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么我不应该在继承中使用平等?

因为很难(不可能?)做到正确,尤其是 对称
属性

说你有一

Vehicle
堂课
Car extendsVehicle
Vehicle.equals()
产生
true
如果参数也是
Vehicle
并且具有相同的重量。如果要实现,
Car.equals()
true
仅当参数也是汽车(重量除外)时,它才应屈服,并且还应比较制造商,发动机等。

现在想象下面的代码:

Vehicle tank = new Vehicle();Vehicle bus = new Car();tank.equals(bus);  //can be truebus.equals(tank);  //false

true
如果巧合的是,油箱和客车的重量相同,则第一个比较可能会得出结果。但是由于坦克不是汽车,因此将其与汽车相比较总是可以得到收益的
false

您有几种解决方法:

  • 严格:两个对象 只有且 具有完全相同的类型(并且所有属性都相同) 时才 相等。这很不好,例如,当您几乎没有子类化以添加某些行为或装饰原始类时。一些框架也在不引起您注意的情况下对您的类进行子类化(Hibernate,带有CGLIB代理的Spring AOP …)

  • 松散的:如果两个对象的类型“兼容”并且它们的内容(语义上)相同,则它们是相等的。例如,如果两个集合包含相同的元素,则它们是相等的,一个

    HashSet
    与另一个 无关紧要
    TreeSet
    (感谢 @veer 指出这一点)。

这可能会产生误导。取2

linkedHashSet
s(其中插入顺序作为合同的一部分很重要)。但是,由于
equals()
仅考虑原始
Set
合同,因此
true
即使对于明显不同的对象,该比较也会产生收益:

    Set<Integer> s1 = new linkedHashSet<Integer>(Arrays.asList(1, 2, 3));Set<Integer> s2 = new linkedHashSet<Integer>(Arrays.asList(3, 2, 1));System.out.println(s1.equals(s2));


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/495101.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号