Java泛型Pair类swap方法失效,如何正确实现跨类型元素交换?
Pair类swap方法的正确实现方式
你的原swap方法存在类型安全问题:当K和T为不同类型时(比如Pair<String, Integer>),代码里的强制类型转换(K) lastValue和(T) temp会在运行时抛出ClassCastException——Java泛型是类型擦除机制,运行时无法保证跨类型转换的安全性。
由于原Pair类的泛型是<K, T>,它的firstValue固定为K类型、lastValue固定为T类型,直接交换字段值会导致类型不兼容。正确的实现思路是返回一个泛型参数交换后的新Pair实例,具体代码如下:
class Pair<K, T> { private K firstValue; private T lastValue; Pair(K firstValue, T lastValue) { this.firstValue = firstValue; this.lastValue = lastValue; } public K first() { return firstValue; } public T last() { return lastValue; } public void replaceFirst(K newFirstValue) { firstValue = newFirstValue; } public void replaceLast(T newLastValue) { lastValue = newLastValue; } // 正确的swap实现:返回泛型交换后的新Pair实例 public Pair<T, K> swap() { return new Pair<>(lastValue, firstValue); } }
这个实现无需任何强制类型转换,新Pair的泛型<T, K>刚好匹配原Pair的lastValue(T类型)作为新first、原firstValue(K类型)作为新last,完全符合类型安全要求。
如果你的业务场景允许Pair的两个元素必须是同一类型,可以将泛型简化为<T>,此时可以直接在原实例上交换字段:
class Pair<T> { private T firstValue; private T lastValue; Pair(T firstValue, T lastValue) { this.firstValue = firstValue; this.lastValue = lastValue; } public T first() { return firstValue; } public T last() { return lastValue; } public void replaceFirst(T newFirstValue) { firstValue = newFirstValue; } public void replaceLast(T newLastValue) { lastValue = newLastValue; } public void swap() { T temp = firstValue; firstValue = lastValue; lastValue = temp; } }
但这种方式限制了元素类型必须一致,不符合你“存储任意类型<K, T>”的需求,因此优先推荐第一种返回新实例的方案。
内容的提问来源于stack exchange,提问作者EugeneBU
相关产品推荐
相关产品推荐

