2012-09-23 54 views
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; 
} 

有没有其他办法?

+0

当心类型擦除。 – SLaks

+0

我不认为这些方法中的任何一种都可以实际工作。我怀疑你太喜欢了。 –

回答

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。你将不得不在类类型都VKV传递,如果你想这样做检查。

在任何情况下,你的设计似乎过于复杂 - 也许如果你解释你正在尝试做的,有可能是一个更好的解决方案。