正确使用以避免使用泛型类型的不必要的强制转换(SuppressWarnings未经检查的转换)

时间:2011-07-08 14:21:16

标签: java generics abstract-class

有类似的问题,但我没有发现任何真正解决我的问题或涵盖我的实际实施。

使用以下示例代码(反映我的实际情况)

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()和强制转换..!在我看来,我目前的实施是“最好的”,但为什么我会得到这样一个有关的警告呢?

在阅读其他主题之后,似乎没有办法绕过这个警告,但是我应该继续使用当前的实现吗?

2 个答案:

答案 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行。