如何修复Java泛型强转的Unchecked cast编译警告
LinkedStack泛型强转编译警告修复
问题背景
实现链式存储结构的LinkedStack<E>栈类时,所有功能测试均已通过,代码可正常运行,但存在编译警告,需要通过修改equals方法的代码消除该警告。
警告信息
Unchecked cast: 'java.lang.Object' to 'LinkedStack
'
原始问题代码
public final class LinkedStack<E> implements Stack<E> { private Node head = null; private int size = 0; @Override public int size() { return size; } @Override public boolean isEmpty() { return size == 0; } @Override public void clear() { head = null; size = 0; } @Override public boolean contains(E e) { for (int i = 0; i < size; i++) { E temp = pop(); if (temp.equals(e)) { return true; } } return false; } @Override public E top() throws StackEmptyException { if (size == 0) { throw new StackEmptyException(); } return head.element; } @Override public void push(E e) { head = new Node(e, head); size++; } @Override public E pop() throws StackEmptyException { if (size == 0) { throw new StackEmptyException(); } E temp = head.element; head = head.next; size--; return temp; } public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; LinkedStack<E> that = (LinkedStack<E>) o; if (that.size() != this.size()) return false; Node j = that.head; int counter = 0; for (Node i = head; counter < size; i = i.next, j = j.next) { if (i.element == null && j.element == null) { counter++; continue; } if ((i.element != null) && (j.element != null)) { if (!i.element.equals(j.element)) { return false; } } else { return false; } counter++; } return true; } @Override public int hashCode() { int resultat = 1; int counter = 0; for (Node i = head; counter < size; i = i.next) { if (i.element == null) { counter++; continue; } resultat = resultat * i.element.hashCode(); counter++; } return resultat; } protected class Node { private final E element; private final Node next; protected Node(final E element, final Node next) { this.element = element; this.next = next; } } }
警告产生原因
Java泛型在编译阶段会执行类型擦除,运行时不存在LinkedStack<E>的泛型类型信息,虚拟机无法验证Object到LinkedStack<E>的强转是否符合泛型类型约束,因此抛出未检查(unchecked)转换警告。
修复方案
该强转本身是类型安全的:代码已经在强转前通过getClass() != o.getClass()判断了传入对象的实际类型和当前类完全一致,后续元素比较逻辑仅依赖Object#equals方法,不依赖泛型参数的类型约束,不会产生运行时类型错误。
只需做两处修改即可消除警告:
- 为
equals方法补上@Override注解 - 在
equals方法上添加最小作用域的@SuppressWarnings("unchecked")注解,仅抑制该方法内的合法未检查转换警告,不影响其他代码的类型检查
修改后的equals方法代码
@Override @SuppressWarnings("unchecked") public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; LinkedStack<E> that = (LinkedStack<E>) o; if (that.size() != this.size()) return false; Node j = that.head; int counter = 0; for (Node i = head; counter < size; i = i.next, j = j.next) { if (i.element == null && j.element == null) { counter++; continue; } if ((i.element != null) && (j.element != null)) { if (!i.element.equals(j.element)) { return false; } } else { return false; } counter++; } return true; }
内容的提问来源于stack exchange,提问作者matin_mhz
相关产品推荐
相关产品推荐

