1

我有一个类,其中包含几个从一种泛型类型转换为另一种泛型类型的方法,但如果两者都返回原始值:参数类型和返回类型相同。我能想到的最佳选择是转换参数类型并将其包装在 try catch 语句中,但这对我来说似乎很脏。

public WK wrapKey(K key) {...


public abstract class MyClass<K, V extends Comparable, WK, WV> extends BaseClass<Map<WK, WV>, KeyValueBean<K, V>> {

...
public WK wrapKey(K key) {

    try {
        return (WK) key;
    } catch (Exception e) {
        return null;
    }
}

public WV wrapValue(V value) {

    try {
        return (WV) value;
    } catch (Exception e) {
        return null;
    }
}

我认为另一种选择可能是将类类型指定为构造函数或setter方法中的参数,然后使用isAssignableFrom:

public WV wrapValue(V value) {
  if (value.class.isAssignableFrom(this.getWrappedValueClass())){
     return WK(V);
  }
  return null;
}

有没有别的办法??

4

1 回答 1

2

Java 通过类型擦除实现泛型,这意味着所有类型检查都在编译时执行,然后泛型在运行时被擦除。因此,您下面的代码实际上什么都不做:

public WV wrapValue(V value) {
    try {
        return (WV) value;
    } catch (Exception e) {
        return null;
    }
}

在运行时,这相当于:

public Object wrapValue(Object value) {
  return value;
}

此方法永远不会抛出异常,而是此方法的调用者可能会抛出异常,因为编译器在调用站点添加了隐式转换。

您的第二个示例甚至无法编译,因为您无法执行value.class. 如果要进行此检查V,则必须传入两者的类类型。KV

无论如何,您的设计似乎过于复杂——也许如果您解释您要做什么,可能会有更好的解决方案。

于 2012-09-23T02:39:03.050 回答