相关疑难解决方法(0)

如何处理未经检查的投射警告?

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)

java generics warnings

583
推荐指数
12
解决办法
42万
查看次数

为什么我不能在Java中创建类型参数的数组?

好吧,我已经阅读了很多这个问题的答案,但我有一个更具体的问题.以下面的代码片段为例.

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)

java arrays generics

17
推荐指数
2
解决办法
680
查看次数

如何使用泛型来处理函数的重载决策模糊性?

考虑这个有两个函数的类,一个带有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>,KInt,并且两个函数都匹配调用时,导致错误:

val m = C<Int, SomeType>()
m.f(1)
Run Code Online (Sandbox Code Playgroud)

过载分辨率模糊.所有这些功能都匹配:

  • public final fun f(index: Int): SomeType 定义于 C
  • public final fun f(key: Int): Pair<Int, SomeType>? 定义于 C

f在这种情况下,如何拨打我想要的电话?

generics ambiguous overload-resolution kotlin

9
推荐指数
1
解决办法
3085
查看次数

ClassCastException Double to Float,即使我没有使用Double

我花了好几个小时来处理这个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平等truemyMap.get("key1") instanceof Float平等false.

我在线上Double value1 = myMap.get("key1").doubleValue();或在线上得到错误Float value1 = myMap.get("key1");

java casting

2
推荐指数
1
解决办法
1332
查看次数

将 List&lt;Object&gt; 转换为 List&lt;Map&lt;String, Object&gt;&gt;

我应该知道这一点,但由于某种原因我无法理解这一点。

为什么我不能将对象 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)

java hashmap

2
推荐指数
1
解决办法
1万
查看次数