gpt4 book ai didi

java - 如何使用不会导致 "uses unchecked or unsafe operations"警告的泛型实现 java 类

转载 作者:行者123 更新时间:2023-11-30 10:59:18 28 4
gpt4 key购买 nike

我试图实现一些使用泛型的示例类,我注意到我的部分代码突出显示了以下警告:

Information:java: SomethingAbstract.java uses unchecked or unsafe operations.

这发生在这段代码 converter.convert(this) 上。

我怀疑问题实际上出在我的 ConverterFactory.getConverter(...) 的返回类型上。我试图改变它返回转换器然后我得到

Error:(6, 20) java: incompatible types: org.test.AtoBConverter cannot be converted to org.test.Converter

我试着查看 AtoBConverter 或 BtoAConverter 以了解如何更改它们,但无法弄清楚。

我应该添加/更改什么以使警告消失?

这是我的示例类:

public interface Something {
<R extends Something> R convertTo(Class<R> to);
}

public class SomethingAbstract implements Something {
@Override
public <R extends Something> R convertTo(Class<R> to) {
Converter converter = ConverterFactory.getConverter(this.getClass(), to);
return to.cast(converter.convert(this)); // <<< warning on this line
}
}

public class SomethingA extends SomethingAbstract {}

public class SomethingB extends SomethingAbstract {}

然后是使用 Something 类型做一些工作的类:

// Convert T to R
public interface Converter<T extends Something, R extends Something> {
R convert(T toConvert);
}

public class AtoBConverter implements Converter<SomethingA, SomethingB> {
@Override
public SomethingB convert(SomethingA toConvert) {
SomethingB somethingB = new SomethingB();
// Do some stuff to convert
return somethingB;
}
}

public class BtoAConverter implements Converter<SomethingB, SomethingA> {
@Override
public SomethingA convert(SomethingB toConvert) {
SomethingA somethingA = new SomethingA();
// Do some stuff to convert
return somethingA;
}
}

以及用于获取正确转换器的工厂:

public class ConverterFactory {
public static <T extends Something, R extends Something> Converter getConverter(Class<T> from, Class<R> to) {
if (from.equals(SomethingA.class) && to.equals(SomethingB.class)) {
return new AtoBConverter();
} else if (from.equals(SomethingB.class) && to.equals(SomethingA.class)) {
return new BtoAConverter();
}
throw new UnsupportedOperationException("No converter found to convert from " + from + " to" + to);
}
}

最后,这意味着要像这样使用:

SomethingA a = new SomethingA();
SomethingB b = a.convertTo(SomethingB.class);

最佳答案

你的 Converter接口(interface)是通用的,所以 ConverterFactory#getConverter() 的返回类型也应该是通用的。

不过,真正的问题还有另一个:

  • AtoBConverter extends Converter<SomethingA, SomethingB>
  • BtoAConverter extends Converter<SomethingB, SomethingA>

尽管这两种类型都扩展了 Converter ,它们不会在运行时扩展相同的父类(super class),因为(例如)AtoBConverter将公开一个带有签名的方法 SomethingA convert(SomethingB toConvert) ,而另一个将公开一个带有签名的方法 SomethingB convert(SomethingA toConvert) .然而,这会被编译器检测到并正确地引发错误,因为 AtoBConverterBtoAConverter不能由 getConverter 生产方法。唯一可能同时匹配它们的返回类型是 Converter<?, ?> ,但我认为它不适合您的情况。

但是,有一个简单的解决方法 - 您可以在工厂类中引入两个单独的方法,它们会产生 AtoBConverter。和 BtoAConverter :

public class ConverterFactory {

public static AtoBConverter getAToBConverter() {
return new AtoBConverter();
}

public static BtoAConverter getBToAConverter() {
return new BtoAConverter();
}

}

然后,我相信SomethingASomethingB 不应该负责将自己转换成其他东西 - 这应该是转换器所做的,这就是我找到 Something#convertTo() 的原因方法冗余(以及 SomethingAbstract 类)。

最后,你将能够做到:

SomethingA a = new SomethingA();
AtoBConverter converter = ConverterFactory.getAToBConverter();
SomethingB b = converter.convert(a);

关于java - 如何使用不会导致 "uses unchecked or unsafe operations"警告的泛型实现 java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31921606/

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