繁体   English   中英

java:如何修复Unchecked转换警告

[英]java: How to fix the Unchecked cast warning

我有以下代码:

private HashMap<Class<?>, HashMap<Entity, ? extends Component>> m_componentStores;

public <T extends Component> T getComponent(Entity e, Class<T> exampleClass)
{
    HashMap<Entity, ? extends Component> store = m_componentStores.get(exampleClass);

    T result = (T)store.get(e);

    if (result == null)
    {
        throw new IllegalArgumentException( "GET FAIL: "+e+" does not possess Component of class\nmissing: "+exampleClass );
    }

    return result;
}

当我编译时,它表明T result = (T)store.get(e)具有未经检查的转换。

Type safety: Unchecked cast from capture#2-of ? extends Component to T

我缺少什么来防止出现此警告?

Class.cast是您想要的。 好吧,您可能会考虑不使用反射。

更改行:

T result = (T)store.get(e);

至:

T result = exampleClass.cast(store.get(e));

在Cast语句上方编写@SuppressWarnings("unchecked")

@SuppressWarnings("unchecked")
T result = (T)store.get(e);

并添加解释性说明,为什么可以安全地忽略该警告。

在泛型中extends不是真的那样。 T != ? extends Component ? extends Component即使T extends Component 实际上,您拥有的是通配符捕获 ,它具有不同的用途。

是的,您的解决方案不是类型安全的-两者之间没有关系? 标记在:

    private HashMap<Class<?>, HashMap<Entity, ? extends Component>> m_componentStores;

因此,使用其他某个类(甚至不是Component的子类)作为键,将Component的某个子类的实例放入此结构是合法的。

请记住,泛型类型仅在编译时才能解析,因此在运行时, m_componentStores除了extends Component之外,无法知道其中的值的确切类型。

因此,您从store.get(e)获得的类型是... Component

    Component result = store.get(e);

ComponentT ,编译器将发出警告,因为无法静态检查强制转换。 但是,如果您确定数据结构的语义,则可以简单地取消警告。

    @SuppressWarnings("unchecked")
    T resultT = (T)result;

PS:您不需要通配符捕获,以下情况在您的情况下将完全相同:

    private HashMap<Class<?>, HashMap<Entity, Component>> m_componentStores;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM