java-如何实现泛型类型的equals?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-如何实现泛型类型的equals?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1577字,纯文字阅读大概需要3分钟。
内容图文
![java-如何实现泛型类型的equals?](/upload/InfoBanner/zyjiaocheng/685/a1c85027207b4ed1aeaf3aca72704790.jpg)
假设我有一个像这样的通用容器类型:
public final class Container<T> {
public final T t;
public Container(final T t) {
this.t = t;
}
}
我想实现等于以使通过:
final Container<Object> a = new Container<>("Hello");
final Container<String> b = new Container<>("Hello");
assertNotEquals(a, b);
实例a和b应该不同,因为它们的类型参数T不同.
但是,由于要擦除,因此很难做到.例如,此实现不正确:
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj != null && obj instanceof Container<?>) {
final Container<?> other = (Container<?>)obj;
return Objects.equals(this.t, other.t);
}
return false;
}
我希望我需要为T存储某种令牌.
如何实现泛型类型的equals?
This无法回答问题.
解决方法:
您可以修改一些Container类并添加以下字段:
public final Class<T> ct;
并等于等于然后
System.out.println(a.equals(b));
将返回false,因为equals方法将检查Class< String> vs Class< Object>
class Container<T> {
public final T t;
public final Class<T> ct;
public Container(final T t, Class<T> ct) {
this.t = t;
this.ct = ct;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = (prime * result) + ((ct == null) ? 0 : ct.hashCode());
result = (prime * result) + ((t == null) ? 0 : t.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Container other = (Container) obj;
if (ct == null) {
if (other.ct != null)
return false;
} else if (!ct.equals(other.ct))
return false;
if (t == null) {
if (other.t != null)
return false;
} else if (!t.equals(other.t))
return false;
return true;
}
}
内容总结
以上是互联网集市为您收集整理的java-如何实现泛型类型的equals?全部内容,希望文章能够帮你解决java-如何实现泛型类型的equals?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。