Eclipse正在向我发出以下形式的警告:
类型安全:从Object到HashMap的未选中转换
这是来自对我无法控制的API的调用返回Object:
HashMap<String, String> getItems(javax.servlet.http.HttpSession session) {
HashMap<String, String> theHash = (HashMap<String, String>)session.getAttribute("attributeKey");
return theHash;
}
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我想避免Eclipse警告,因为理论上它们至少表明存在潜在的代码问题.但是,我还没有找到一种消除这种方法的好方法.我可以将涉及的单行提取到方法中并添加@SuppressWarnings("unchecked")到该方法,从而限制了我忽略警告的代码块的影响.有更好的选择吗?我不想在Eclipse中关闭这些警告.
在我来到代码之前,它更简单,但仍然引发了警告:
HashMap getItems(javax.servlet.http.HttpSession session) {
HashMap theHash = (HashMap)session.getAttribute("attributeKey");
return theHash;
}
Run Code Online (Sandbox Code Playgroud)
当您尝试使用哈希时,问题出在其他地方,您会收到警告:
HashMap items = getItems(session);
items.put("this", "that");
Type safety: The method put(Object, Object) belongs to the raw type HashMap. References to generic type HashMap<K,V> should be parameterized.
Run Code Online (Sandbox Code Playgroud) 好吧,我已经阅读了很多这个问题的答案,但我有一个更具体的问题.以下面的代码片段为例.
public class GenericArray<E>{
E[] s= new E[5];
}
Run Code Online (Sandbox Code Playgroud)
在类型擦除之后,它变成了
public class GenericArray{
Object[] s= new Object[5];
}
Run Code Online (Sandbox Code Playgroud)
这段代码似乎运作良好.为什么会导致编译时错误?
此外,我从其他答案中得知,以下代码适用于同一目的.
public class GenericArray<E>{
E[] s= (E[])new Object[5];
}
Run Code Online (Sandbox Code Playgroud)
我读过一些评论说上面的代码是不安全的,但为什么它不安全?任何人都可以向我提供一个特定的例子,其中上面的代码导致错误?
另外,以下代码也是错误的.但为什么?擦除后似乎也能正常工作.
public class GenericArray<E>{
E s= new E();
}
Run Code Online (Sandbox Code Playgroud) 考虑这个有两个函数的类,一个带有Int参数,另一个带有泛型函数:
class C<K, V> {
// ...
operator fun f(index: Int): Pair<K, V> = ...
operator fun f(key: K): V = ...
}
Run Code Online (Sandbox Code Playgroud)
当它被参数化为C<Int, SomeType>,K是Int,并且两个函数都匹配调用时,导致错误:
val m = C<Int, SomeType>()
m.f(1)
Run Code Online (Sandbox Code Playgroud)
过载分辨率模糊.所有这些功能都匹配:
public final fun f(index: Int): SomeType定义于Cpublic final fun f(key: Int): Pair<Int, SomeType>?定义于C
f在这种情况下,如何拨打我想要的电话?
我花了好几个小时来处理这个bug,对我来说这是一个非常奇怪的行为:
这是我的代码:
Map<String, Float> myMap = myService.calculateData(DateTime startDate, DateTime endDate);
if (!myMap.isEmpty()) {
Double value1 = myMap.get("key1").doubleValue();
}
Run Code Online (Sandbox Code Playgroud)
在调试器中,一切正常,我可以看到所有的值,myMap我可以得到value1Double 的值.
但是,IntelliJ会抛出错误:
java.lang.ClassCastException:java.lang.Double无法强制转换为java.lang.Float
我试过更换 Double value1 = myMap.get("key1").doubleValue();
用: Float value1 = myMap.get("key1");
我得到完全相同的错误,即使我没有使用任何双倍!
另外我不明白为什么它说Double不能被转换为Float,当我实际上试图将Float转换为Double时,所以它是另一种方式.
更新:回答路易斯和安德烈亚斯的建议,myMap.get("key1").getClass()给我Double,myMap.get("key1") instanceof Double平等true和myMap.get("key1") instanceof Float平等false.
我在线上Double value1 = myMap.get("key1").doubleValue();或在线上得到错误Float value1 = myMap.get("key1");
我应该知道这一点,但由于某种原因我无法理解这一点。
为什么我不能将对象 List<Object>列表转换为地图列表List<Map<String, Object>>?列表中的每个对象都是 type 的对象Map<String, Object>,那么为什么不能进行转换呢?
我能做的是创建一个new ArrayList<Map<String, Object>>();并遍历列表并使用演员表添加每个项目。
List<Object> dataList;
..
//Why doesn't this work?
List<Map<String, Object>> rxData = (List<Map<String, Object>>)dataList;
//This works, but is there a better way?
rxData = new ArrayList<Map<String, Object>>();
for (Object data : dataList) {
rxData.add((Map<String, Object>)data);
}
Run Code Online (Sandbox Code Playgroud)