gpt4 book ai didi

java - 泛型类型转换

转载 作者:行者123 更新时间:2023-11-30 04:39:55 24 4
gpt4 key购买 nike

我有一个类,其中有几个从一种泛型类型转换为另一种泛型类型的方法,但如果参数类型和返回类型相同,我想返回原始值。我能想到的最佳选择是转换参数类型并将其包装在 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;
}

还有别的办法吗?

最佳答案

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 的类类型。

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

关于java - 泛型类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12549193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com