- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题与 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/
我是一名优秀的程序员,十分优秀!