gpt4 book ai didi

java - 警告 - 类是原始类型。对泛型类型 Class 的引用应该参数化

转载 作者:行者123 更新时间:2023-12-01 21:22:04 24 4
gpt4 key购买 nike

这个问题与 Eclipse warning - Class is a raw type. References to generic type Class<T> should be parameterized 不一样。只是生成的警告是相同的。

下面的代码会产生警告:

X.PropertyType is a raw type. References to generic type X.PropertyType should be parameterized.

在使用 Eclipse 构建时指示的行处。 Eclipse 提供的一种快速修复方法是添加 @SuppressWarnings("unchecked")但我不想在没有完全理解其含义的情况下这样做,目前我还没有完全理解。

如何消除警告而不抑制它?我已经看到了与此警告相关的其他问题,但我认为我需要特定于下面代码的答案才能理解该问题。

import java.util.HashMap;
import java.util.Map;

public class X
{
// *** WARNING ***
private final Map<String, PropertyType> m_properties = new HashMap<String, PropertyType>();

public class PropertyType<T>
{
private final String m_name;
private final T m_value;
private final Class<T> m_type;

public PropertyType(String name, T value, Class<T> type)
{
m_name = name;
m_value = value;
m_type = type;
}

public String getName() { return m_name; }

public T getValue() { return m_value; }

public Class<T> getType() { return m_type; }
}

public <U> void setProperty(String name, U value)
{
// *** WARNING ***
m_properties.put(name, new PropertyType(name, value, String.class));
}
}

另外,在方法 setProperty 中,我想传递 value 的类型创建 PropertyType 的实例时。我只是传递一个 String此刻输入。最好的方法是什么?

我可以修改setProperty如下:

public <U> void setProperty(String name, U value, Class<U> type)

但我一直在寻找更好的方法。

最佳答案

在这里,您使用的是原始 PropertyType类型:

private final Map<String, PropertyType> m_properties = new HashMap<String, PropertyType>();
// -----------------------^^^^^^^^^^^^^

...但是你已经声明了 PropertyType作为参数化类型,因此编译器和 IDE 自然会警告您正在执行参数化到原始的操作,这通常表明存在错误。

通常我会说你需要参数化它:

private final Map<String, PropertyType<T>> m_properties = new HashMap<String, PropertyType>();
// -----------------------------------^^^

...但你说过你不想参数化 X ,包含类。

您需要参数化 X ,或制作 PropertyType原始类型。考虑这个方法:

public <U> void setProperty(String name, U value)
m_properties.put(name, new PropertyType(name, value, String.class));
}

可以使用任何 U 来调用它类型,但是你的m_properties只能用单个 T 创建(或者是原始的)。

基于X,你不需要PropertyType进行参数化。或者你想要X (在这种情况下,您可以从 <U> 声明中删除 setProperty)。这基本上就是选择。

关于java - 警告 - 类是原始类型。对泛型类型 Class<T> 的引用应该参数化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38970444/

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