- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图实现一些使用泛型的示例类,我注意到我的部分代码突出显示了以下警告:
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)
.然而,这会被编译器检测到并正确地引发错误,因为 AtoBConverter
和 BtoAConverter
不能由 getConverter
生产方法。唯一可能同时匹配它们的返回类型是 Converter<?, ?>
,但我认为它不适合您的情况。
但是,有一个简单的解决方法 - 您可以在工厂类中引入两个单独的方法,它们会产生 AtoBConverter
。和 BtoAConverter
:
public class ConverterFactory {
public static AtoBConverter getAToBConverter() {
return new AtoBConverter();
}
public static BtoAConverter getBToAConverter() {
return new BtoAConverter();
}
}
然后,我相信SomethingA
和 SomethingB
不应该负责将自己转换成其他东西 - 这应该是转换器所做的,这就是我找到 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/
我是一名优秀的程序员,十分优秀!