java - 在 Java 中为具有类型参数的类编写平等契约

标签 java generics casting

tl;dr:如何使用类型参数强制转换对象而不引发“未经检查的强制转换”警告?即:

List<Foo> bar = (List<Foo>) obj;

编译器向我发出有关以下代码的“未经检查的转换”警告。如何修复该警告?在强制转换之前放置 @SuppressWarnings("unchecked") 是最悲惨的解决方案。

public class Container<V> {
    public V getV();

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Container<V> other = (Container<V>) obj;
        return this.getV().equals(other.getV());
    }
}

最佳答案

您不需要将其转换为 Container<V> 。您不能将其转换到 Container<V>无论如何,没有未经检查的强制转换警告,因为它可能是 Container任何东西。

但是当您遵循equals时关于V结果来自 getV , equals将进行自己的类型检查(或者应该进行)。

您只需将其转换为 Container<?> ;让equals您调用的方法确保 other的对象是equal到你自己的对象的V .

Container<?> other = (Container<?>) obj;

关于java - 在 Java 中为具有类型参数的类编写平等契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28975234/

相关文章:

java - 数字的第一位数字加上第二位数字

c# - 使用简单注入(inject)器解析通用装饰器

java - 如何在 Selenium 的 Xpath 中转义双引号?

java - 关于javaFX,需要将 ListView 内的节点与最右侧对齐

java - 通过 apache tomcat 8 运行时无法运行 h2 数据库查询

java - 有界类型参数

java - 比较 Java 中的类类型有什么区别

c - 什么时候指针类型之间的转换不是 C 中的未定义行为?

javascript - 使用 ob_get_clean 设置的 php 变量是一个字符串,但不会转换为整数

c++ - 如何将接口(interface)对象转换为特定的继承对象