相关疑难解决方法(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万
查看次数

将对象转换为通用类型以进行返回

有没有办法强制转换对象的方法值?我试过这种方式,但它在"instanceof"部分中给出了一个编译时异常:

public static <T> T convertInstanceOfObject(Object o) {
    if (o instanceof T) {
        return (T) o;
    } else {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

我也试过这个,但它给出了一个运行时异常,ClassCastException:

public static <T> T convertInstanceOfObject(Object o) {
    try {
        T rv = (T)o;
        return rv;
    } catch(java.lang.ClassCastException e) {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有可能轻松地做到这一点:

String s = convertInstanceOfObject("string");
System.out.println(s); // should print "string"
Integer i = convertInstanceOfObject(4);
System.out.println(i); // should print "4"
String k = convertInstanceOfObject(345435.34);
System.out.println(k); // should print "null"
Run Code Online (Sandbox Code Playgroud)

编辑:我写了正确答案的工作副本:

public static <T> T …
Run Code Online (Sandbox Code Playgroud)

java generics casting

124
推荐指数
3
解决办法
17万
查看次数

通过未经检查的类型转换在Java中创建通用数组

如果我有一个泛型类Foo<Bar>,我不允许创建一个数组,如下所示:

Bar[] bars = new Bar[];
Run Code Online (Sandbox Code Playgroud)

(这将导致错误"无法创建Bar的通用数组").

但是,正如dimo414在回答这个问题(Java如何:通用数组创建)中所建议的那样,我可以做到以下几点:

Bar[] bars = (Bar[]) new Object[];
Run Code Online (Sandbox Code Playgroud)

(这将"仅"生成警告:"类型安全:从Object []到Bar []"的未选中的强制转换.

在回应dimo414的回答的评论中,有些人声称使用这种结构可能会在某些情况下引起问题而其他人说它很好,因为对数组的唯一引用是bars,它已经是所需的类型.

我有点困惑,在哪些情况下这是可以的,在哪些情况下,它可以让我陷入困境.例如,newacctAaron McDaid的评论似乎直接相互矛盾.不幸的是,原始问题中的评论流只是以未解答的"为什么这个'不再正确'?"结束,所以我决定为它提出一个新问题:

如果bars-array只包含类型的条目Bar,那么在使用数组或其条目时是否仍然存在任何运行时问题?或者是唯一的危险,在运行时我可以在技术上将数组转换为其他东西(比如String[]),然后允许我用其他类型的值填充它Bar

我知道我可以使用Array.newInstance(...),但我对上面的类型转换构造特别感兴趣,因为,例如,在GWT中,newInstance(...)-option不可用.

java arrays generics casting type-safety

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

标签 统计

generics ×3

java ×3

casting ×2

arrays ×1

type-safety ×1

warnings ×1