gpt4 book ai didi

java - 围绕未经检查的转换警告重新设计

转载 作者:搜寻专家 更新时间:2023-11-01 02:24:29 26 4
gpt4 key购买 nike

我有一个类将包含一些针对不同对象的不同解析器实现。虽然我能够在没有任何警告的情况下存储解析器实现,但从映射中获取解析器会警告未检查的转换异常。以下是一个简化的摘录:

private Map<Class<?>, Parser<?>> parsers = new HashMap<>();

public <T> void addParser(Class<T> type, Parser<T> parser) {
parsers.put(type, parser);
}

private <T> Parser<T> parserFor(Class<T> type) {
// Compiler complains about unchecked cast below
return (Parser<T>) parsers.get(type);
}

是否有另一种方法可以实现类似的逻辑而不会导致未检查的转换警告?

最佳答案

无法创建 Map<Class<...>, Parser<...>> ...在哪里-s 可以是任何东西,但必须匹配一个键和它的值;所以你无法让编译器为你做检查,在那里检索 Class<T>保证给你一个Parser<T> .但是,您的代码本身是正确的; 知道您的转换是正确的,即使编译器不正确。

所以,当您知道您的转换是正确的,但 Java 不知道时,您可以做什么?

最好和最安全的方法是编写一段尽可能小的特定代码,负责处理已检查和未检查逻辑之间的转换,并确保未检查逻辑不会导致任何错误.然后,您只需使用适当的 @SuppressWarnings 标记该代码即可。注解。例如,你可以有这样的东西:

public abstract class Parser<T> {
private final Class<T> mType;

protected Parser(final Class<T> type) {
this.mType = type;
}

public final Class<T> getType() {
return mType;
}

@SuppressWarnings("unchecked")
public final <U> Parser<U> castToParserOf(final Class<U> type) {
if (type == mType) {
return (Parser<U>) this;
} else {
throw new ClassCastException("... useful message ...");
}
}
}

这将允许您在您的示例中安全地编写:

public <T> void addParser(final Parser<T> parser) {
parsers.put(parser.getType(), parser);
}

private <T> Parser<T> parserFor(final Class<T> type) {
return parsers.get(type).castToParserOf(type);
}

关于java - 围绕未经检查的转换警告重新设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28423565/

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