gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:13:12 38 4
gpt4 key购买 nike

那里有类似的问题,但我没有找到任何真正回答我的问题或涵盖我的实际实现的问题。

结合下面的示例代码(比较符合我的实际情况)

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 {
// ...
}
}

即使我使用了 suppresswarnings,你会认为这是正确的用法吗?我的意思是我知道 WhateverDtoXmlParser 返回的类型将是 WhateverDto而不仅仅是任何其他 Dto,因为我是这样编码的。为什么 Java 不能检查返回类型是否为 extends Dto 因为我用 <T extends Dto 明确指定了它>(加上它扩展了一个抽象类...)并接受它?

要么我在那里做,要么我必须使用 instanceof s 和 cast 每次我使用 getDto() .. !在我看来,我目前的实现是“最好的”,但为什么我会收到如此令人担忧的警告?

阅读其他线程后,似乎没有办法绕过这个警告,但我应该继续我当前的实现吗?

最佳答案

试试这个:

abstract class AbstractDtoXmlParser<T extends Dto> {
public abstract T getDto();
}

class WhateverDtoXmlParser extends AbstractDtoXmlParser<WhateverDto> {

@Override
public WhateverDto getDto() {
return new WhateverDto();
}
}

关于java - 正确使用泛型类型避免不必要的转换(SuppressWarnings 未经检查的转换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6625813/

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