在Java中为类型参数编写类的相等契约

时间:2015-03-10 22:24:07

标签: java generics casting

tl; dr:如何使用类型参数转换对象而不会产生未选中的强制转换'警告?即:

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

编译器正在给我一个未经检查的演员&#39;警告以下代码。如何修复警告?在演员阵容之前放置@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());
    }
}

1 个答案:

答案 0 :(得分:3)

您不需要将其投放到Container<V>。无论如何,您都无法将其转换为Container<V>而无需检查投射警告,因为它可能是任何内容的Container

但是当您从equals V推迟getV时,equals将会进行自己的类型检查(或应该)。

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

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