正确使用以避免泛型类型不必要的转换(SuppressWarnings 未经检查的转换)
那里有类似的问题,但我没有找到任何真正解决我的担忧或涵盖我的实际实施的问题。
使用以下示例代码(反映了我的实际情况),
public class MainTest {
public static void main(String[] args) {
WhateverDtoXmlParser parser = (new MainTest()).new WhateverDtoXmlParser();
// I want to do this (having to do suppressWarnings)
WhateverDto wd = parser.getDto();
// Instead of (usage without the warning).
// I want to avoid all of this!
Dto d = parser.getDto();
WhateverDto wd2 = null;
if (d instanceof WhateverDto) { // All of this is stupid and unnecessary IMO.
wd2 = (WhateverDto) d;
}
}
abstract class AbstractDtoXmlParser {
public abstract <T extends Dto> T getDto();
}
class WhateverDtoXmlParser extends AbstractDtoXmlParser {
@SuppressWarnings("unchecked")
@Override
public WhateverDto getDto() { // instead of public Dto getDto() (to avoid instanceof + cast)
return new WhateverDto();
}
}
abstract class Dto {
// ...
}
public class WhateverDto extends Dto {
// ...
}
}
即使我使用了抑制警告,您是否认为这是正确的用法?
我的意思是我知道从 WhateverDtoXmlParser
返回的类型将是 WhateverDto
而不仅仅是任何其他 Dto,因为我是这样编码的< /强>。为什么 Java 不能检查返回类型是否扩展 Dto
,因为我使用 显式指定它(加上它扩展一个抽象类...)并接受它?
要么我在那里执行此操作,要么我每次使用 getDto()
时都必须使用 instanceof
并进行强制转换..!在我看来,我当前的实现是“最好的”,但是为什么我会收到如此令人担忧的警告?
阅读其他线程后,似乎没有办法绕过此警告,但我应该继续当前的实现吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
试试这个:
Try this:
如果您确定返回的类型是您期望的类型,那么执行这样的不安全转换没有任何问题...
这仍然不是最干净的,但它不应该给您警告并且它会赢也不用写4行。
If you know for sure the type you are getting back is the type you are expecting, there is nothing wrong with doing an unsafe cast like this...
This still isn't the cleanest but it shouldn't give you warnings and it won't take 4 lines to write either.