警告 - 类是原始类型。应参数化对泛型类<t>的引用

时间:2016-08-16 08:50:25

标签: java generics

此问题与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)

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

4 个答案:

答案 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;变量名称;糟糕的风格。