当前位置: 首页 > 面试题库 >

Java泛型-在调用instanceof之后,有什么方法可以避免强制转换(和未经检查的警告)?

廖君昊
2023-03-14
问题内容

Android代码-SharedPreferences类导出用于持久/检索不同首选项的不同方法:

@SuppressWarnings("unchecked")
public static <T> T retrieve(Context ctx, String key, T defaultValue) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
    if (defaultValue instanceof Boolean) return (T) (Boolean) prefs
            .getBoolean(key, (Boolean) defaultValue);
    else if (defaultValue instanceof Float) return (T) (Float) prefs
            .getFloat(key, (Float) defaultValue);
    // etc - another 4 cases
}
这行得通,我可以打电话给`boolean stored = retrieve(ctx, “BOOLEAN_KEY”,
true) 我,但是我的问题是:由于我已经使用过instanceof 并且T 归结为特定的类,有没有一种方法可以避免单次和两次强制转换以及warning
unchecked`?

编辑
:如果我要通过类,我可能会调用getBoolean()getFloat()等。我想要的是简化方法的内部结构,摆脱警告,但仍然可以调用retrieve(ctx,"KEY", 1 or "string" or true)并得到我想要的东西


问题答案:

好吧我的问题 是(简单):
由于我已经使用过instanceof,并且T归结为特定的类,有没有一种方法可以避免单次和两次强制转换以及警告:未选中?



 类似资料:
  • 问题内容: 不知何故,我的旧问题已关闭,因此我打开了一个新问题: 我正在使用Java泛型从SQL查询中实现泛型双向Hash Map。它应该能够来回映射String,Integer对的任何组合。应该这样使用: 当然应该可以创建一个pm(Integer,Integer)等等。 我选择地图的实现如下所示(没有getter …): 我没有编译器错误,而且我很确定,它将以这种方式工作。但是我在“ getIn

  • 我在这里遇到了一个关于带列表的泛型有界类型的小问题。请帮帮我! 有什么方法可以克服这个问题,或者我可以安全地压制警告吗?

  • 问题内容: 我正在尝试制作一个称为myHash的Point HashSet的浅表副本。截至目前,我有以下内容: 这段代码给了我一个未经检查的强制转换警告。有一个更好的方法吗? 问题答案: 您可以尝试以下方法:

  • 问题内容: 在我的spring应用程序上下文文件中,我有类似以下内容: 在java类中,实现如下所示: 在Eclipse中,我看到一条警告: 类型安全性:未经检查的从Object到HashMap的转换 我做错了什么?我该如何解决该问题? 问题答案: 好吧,首先,你正在通过新的HashMap创建调用浪费内存。你的第二行完全忽略了对此创建的哈希图的引用,从而使该哈希图可用于垃圾收集器。因此,不要这样做

  • 问题内容: 我不明白为什么在尝试执行以下操作时会收到警告(未经检查的演员表): 我的意思是将castedMap发布到外部代码的危险是什么?两种操作均可在运行时完美运行: 使用SomeType类型的键从castedMap获取元素 使用SomeType类型的键将元素放入castedMap中。 我只是使用@SuppressWarnings(“ unchecked”)取消警告。 问题答案: 答案可能很无聊

  • 问题内容: 在下面的示例中(来自我的Coursepack),我们希望给该Square实例c1一些其他对象的引用p1,但前提是这两个对象是兼容类型的。 我在这里不明白的是,我们首先检查p1确实为Square,然后仍将其强制转换。如果是Square,为什么要投射? 我怀疑答案在于表观类型和实际类型之间的区别,但是我还是很困惑…… 编辑: 编译器将如何处理: Edit2: 是instanceof检查实际