gpt4 book ai didi

java - 如何使用 Java 泛型避免不安全的强制转换警告

转载 作者:行者123 更新时间:2023-12-01 19:07:35 27 4
gpt4 key购买 nike

我对 Java 泛型还很陌生。但我已经阅读了很多摘要链接和示例。但我无法正确使用最简单的方法。我希望有人能帮忙:

我想创建一个 HashMap,将一个 undefined object 映射到另一个对象。两个对象都可以是 String 或 Integer 之一。

所以我写了这个:

private final HashMap<L, R> left2Right = new HashMap<L, R>();

Extractor<?> extLeft = Extractor.getInstance(0);
Extractor<?> extRight = Extractor.getInstance(1);

L leftVal = extLeft.extract(d, i);
R rightVal = extRight.extract(d, i);

this.left2Right.put(leftVal, rightVal);

到目前为止一切顺利...但是我在实现提取器对象时遇到了问题。它们由工厂模式实例化。我是这样做的(简单的):

abstract class Extractor<E> {
abstract E extract(DTable source, int row);

static <E> Extractor<E> getInstance(int type) {
if(type == 0)
return new IntExtractor();
else
return new StringExtractor();
}
}

class IntExtractor extends Extractor<Integer> {

@Override
Integer extract(DTable source, int row) {
int value = 5;
return new Integer(value);
}

}

class StringExtractor extends Extractor<String> {

@Override
String extract(DTable source, int row) {
String retVal = "hello";
return retVal;
}

}

它可以编译,但在将整数/字符串转换为 E 时收到取消保存转换警告。我做错了什么?我知道,我可以简单地抑制警告。但我想这正是Java泛型的优点吧?我无法保存此转换,因为我不知道哪种类型“E”真正"is"...

或者我做的事情根本就是错误的吗?

注意:在使用第一个答案中的一些信息后,我将代码编辑为"new"问题......

最佳答案

你的提取器根本不是通用的。听起来你想要类似的东西:

public interface Extractor<P> {
P extract(DTable source, int row);
}

然后使实现成为非通用的:

class IntExtractor implements Extractor<Integer> {

Integer extract(DTable source, int row) {
int value = 5;
return new Integer(value);
}
}

从根本上讲,您当前的代码已被破坏,因为我可以编写:

IntExtractor<String> extractor = new IntExtractor<String>();
String x = extractor.extract(...);

...这显然会失败,但仅限于执行时。

关于java - 如何使用 Java 泛型避免不安全的强制转换警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9495953/

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