有类似的问题,但我没有发现任何真正解决我的问题或涵盖我的实际实施。
使用以下示例代码(反映我的实际情况)
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不能检查返回类型extends Dto
,因为我使用<T extends Dto
&gt; 明确指定它(加上它扩展了抽象类...)并接受它?
我要么在那里做,要么我每次使用instanceof
时都必须使用getDto()
和强制转换..!在我看来,我目前的实施是“最好的”,但为什么我会得到这样一个有关的警告呢?
在阅读其他主题之后,似乎没有办法绕过这个警告,但是我应该继续使用当前的实现吗?
答案 0 :(得分:3)
试试这个:
abstract class AbstractDtoXmlParser<T extends Dto> {
public abstract T getDto();
}
class WhateverDtoXmlParser extends AbstractDtoXmlParser<WhateverDto> {
@Override
public WhateverDto getDto() {
return new WhateverDto();
}
}
答案 1 :(得分:2)
如果你肯定知道你要回来的类型是你期望的那种类型,做这样的不安全的演员表没有错...
WhateverDto d = (WhateverDto) parser.getDto();
这仍然不是最干净但它不应该给你警告,也不会写4行。