此问题与Eclipse warning - Class is a raw type. References to generic type Class<T> should be parameterized不同。只有生成的警告是相同的。
以下代码会产生警告:
X.PropertyType是原始类型。应该参数化对泛型类型X.PropertyType的引用。
在使用Eclipse构建时指示的行。 Eclipse提供的一个快速修复是添加@SuppressWarnings("unchecked")
,但我不想在没有完全理解其含义的情况下这样做,而目前我还没有这样做。
如何在不抑制警告的情况下消除警告?我已经在SO上看到了与此警告有关的其他问题,但我想我需要一个特定于下面代码的答案才能理解这个问题。
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)
但我一直在寻找更好的方法。
答案 0 :(得分:1)
在这里,您使用的是原始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
)。这基本上就是选择。
答案 1 :(得分:1)
您可以使用wildCard在HashMap声明中解决警告。 E.g。
dateoflvl1pay = list()
for players in lel:
kost = players["_id"]
if kost in x:
dateoflvl1pay.append(players)
或者尽可能传递最终的genericType。
对于第二个问题,您可以使用
HashMap<String, PropertyType<?>> map; //declare
获取其classType,并同时将其用作标识符。 (如果使用classObject作为键而不是String,可能会提高HashMap操作的性能,尽管它的微优化)
答案 2 :(得分:0)
在声明你的hashmap时需要传递一个Type,如下例所示:
private final Map<String, PropertyType<String>> m_properties = new HashMap<String, PropertyType<String>>();
因为它是类级别参数
答案 3 :(得分:0)
你所要求的可能并不像你想要的那样工作。
你可以拥有类似的东西:
public class X<T> {
private final Map<String, PropertyType<T>> m_properties = new HashMap<>();
含义:没有办法使用泛型来允许Map中的不同的种PropertyType<T>
种对象......并且仍然让编译器检查这些类型。这根本不可能。
并提示:阅读有关java编码风格指南的内容。 &#34;匈牙利&#34;符号与&#34; _&#34;变量名称;糟糕的风格。