Java 中转换为泛型类型时的警告

2023-12-29

我有一些通用代码,我无法弄清楚如何合法地防止收到警告;我目前正在使用 @SuppressWarnings("unchecked") ,因为似乎在没有警告的情况下无法完成泛型类型的转换。

我怎样才能摆脱注释?

我所拥有的是:

public MyObject(SharedContext<Object> ctx) {
    super(ctx); // set protected field 'context'
    ...
    context.set("Input Fields"  ,Collections.synchronizedMap(new TreeMap<String,Pair<String,Boolean>>(String.CASE_INSENSITIVE_ORDER)));
    context.set("Output Fields" ,Collections.synchronizedMap(new TreeMap<String,String>              (String.CASE_INSENSITIVE_ORDER)));
    context.set("Event Registry",new EventRegistry(log)                                                                              );
    }

@SuppressWarnings("unchecked")
protected void startup() {
    inputFields     =(Map<String,Pair<String,Boolean>>)context.get("Input Fields"  ,null);
    outputFields    =(Map<String,String>              )context.get("Output Fields" ,null);
    eventRegistry   =(EventRegistry                   )context.get("Event Registry",null);
    ...
    }

受保护的变量上下文是类型SharedContext<Object>.

如果没有注释,编译器会发出警告:

...\MyClass.java:94: warning: [unchecked] unchecked cast
found   : java.lang.Object
required: java.util.Map<java.lang.String,com.mycompany.Pair<java.lang.String,java.lang.Boolean>>
    inputFields     =(Map<String,Pair<String,Boolean>>)context.get("Input Fields"  ,null);
                                                                  ^
...\MyClass.java:95: warning: [unchecked] unchecked cast
found   : java.lang.Object
required: java.util.Map<java.lang.String,java.lang.String>
    outputFields    =(Map<String,String>              )context.get("Output Fields" ,null);

经过一些进一步的研究,我相信我已经找到了一种合理的替代方案,它至少将抑制注释限制为仅一个全局静态实用程序方法来执行未经检查的转换。

下面的独立测试程序应该足够清晰:

public class Generics
{

static public void main(String[] args) {
    Generics.test();
    }

static private void test() {
    Map<String,Object> ctx=new TreeMap<String,Object>();
    Map<String,Object> map=new TreeMap<String,Object>();
    Map<String,Object> tst;

    ctx.put("Test",map);
    tst=uncheckedCast(ctx.get("Test"));
    }

@SuppressWarnings({"unchecked"})
static public <T> T uncheckedCast(Object obj) {
    return (T)obj;
    }

}

另一篇博客建议对此实用方法进行改进:

@SuppressWarnings("unchecked") 
public static <T, X extends T> X uncheckedCast(T o) {
    return (X) o;
    }

强制返回的内容成为传入参数的子类。

假设我将 uncheckedCast 放入公共实用程序类 GenUtil 中,问题中的启动方法将不会发出(无用的)警告,如下所示:

protected void startup() {
    inputFields  =GenUtil.uncheckedCast(context.get("Input Fields"  ,null));
    outputFields =GenUtil.uncheckedCast(context.get("Output Fields" ,null));
    eventRegistry=GenUtil.uncheckedCast(context.get("Event Registry",null));
    ...
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中转换为泛型类型时的警告 的相关文章

随机推荐

  • 带有 XNA 的 Silverlight 与纯 HTML5

    我最近决定进入WP7应用程序开发 但还没有真正开始学习silverlight xna 只有 C 我已经很了解 C 了 我在微软工作的爸爸最近告诉我 学习 Silverlight 没有意义 因为从长远来看它会变得无关紧要 由于HTML5的优越
  • 通过 Selenium 抓取动态内容?

    我正在尝试从Blog http justgivemechocolateandnobodygetshurt blogspot com 通过 Selenium 但它总是返回未渲染的 JavaScript 为了测试这种行为 我尝试等到 ifram
  • Asyncio 和rabbitmq (asynqp):如何同时从多个队列消费

    我正在尝试使用 python asyncio 和同时使用多个队列asynqp http asynqp readthedocs io en v0 4 我不明白为什么我的asyncio sleep 函数调用没有任何效果 代码并没有停在那里 公平
  • 运行子程序时显示动画 gif

    当我的应用程序运行子程序时 如何保持动画 gif 运行 整个用户界面被阻止 所以我尝试以另一种形式显示它 但我得到了相同的结果 两件事情 Use a BackgroundWorker 下面的例子 如果可以的话 最好使用不确定的进度条 但这取
  • 如何将WebResponse.GetResponseStream返回转换为字符串?

    我看到很多例子 但它们都缓慢地将它们读入字节数组或一次 256 个字符 为什么 是否不建议只转换结果Stream值转换为字符串 我可以在其中解析它 您可以使用StreamReader ReadToEnd using Stream strea
  • 获取没有标题/通知栏的窗口大小

    我一直在研究 Android 开发 我想做的一件事就是为我的窗口动态创建背景图像 类似于下面的图像 这是来自我的黑莓应用程序 它由三个独立的部分组成 右下角徽标 左上水印和右下角名称 它的工作与屏幕尺寸无关 因为黑莓应用程序只获取所有三个部
  • 在写入文件之前检查文件是否可写

    我正在尝试创建一个脚本 在写入文件之前检查文件是否可写 确保脚本不会过早退出 我已经走到这一步了 meta stream get meta data file while is writable meta uri sleep rand 0
  • 在元素不存在的地方插入数组,否则更新它(有多个条件)

    id 1 name apple option weight 10 size 40 price 40 weight 40 size 40 price 200 如果重量或大小不同 我想在数组中更新插入新对象 如果大小和重量都匹配 我想更新它 我
  • Bootstrap 弹出框不起作用

    引导弹出窗口没有显示我的页面 这是我的 HTML
  • 在 bash 中,如何从由 tee 管道传输的函数中退出脚本?

    我试图理解为什么每当我使用function 2 gt 1 tee a LOGtee 在函数中创建一个无法通过简单退出的子 shellexit 1 如果我不使用tee它工作正常 下面的例子 bin bash LOG root log log
  • XElement 无法加载带有重音字符的文件

    我有一个相当好奇的问题 使用 XElement 加载方法加载 html 文档 使用 HTML Tidy 检查格式良好 它对于英语文档绝对完美 但是转到法语和西班牙语文档时 我会看到一个XML 异常 XML Exception Invalid
  • Node JS - 读取文件属性

    我正在使用 NWJS 开发桌面应用程序 我需要获取 exe 文件的文件属性 我尝试过使用 npm 属性模块https github com gagle node properties https github com gagle node
  • 在我的例子中奇怪的 ul 列表问题

    我的 ul 列表有一个奇怪的问题 我有类似的东西 section h1 Slide h1 div class break div div a href img src images left nav png a div ul li img
  • numpy 在数组开头添加元素并在末尾删除元素

    在 numpy 数组的开头添加新元素并删除该数组的最后一个元素的最佳方法是什么 我使用了这样的代码 tmp np array 1 2 3 print tmp tmp np insert tmp 0 0 tmp np delete tmp 1
  • iOS PWA Safari 打不开页面?

    如果我在我的 iPad Pro 11 英寸上执行以下操作 关闭 Wifi 并打开飞行模式 打开我们的 iOS PWA 它说 Safari 无法打开该页面 http www example com http www example com 因
  • 将数组作为指针引用

    我似乎无法理解数组或二维数组上不同声明之间的区别 例如 void swap char a char b char t a a b b t int main int argc char argv char a asher char b sab
  • 从可变参数类型列表中获取最大的类型

    我正在尝试从可变参数模板类型列表中获取最大的类型 我得到了意想不到的结果 Bigger between two types template
  • C语言中fflush(stdin)有什么用? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有以下程序 include
  • 在 Python 3 中使用 OpenPyXL 复制整个列

    我正在尝试使用 OpenPyXL 复制整个列 谷歌似乎提供了很多使用范围的示例 但不是针对整个列 我有一个工作簿 其中只有一个工作表 A 列和 JX 列中包含大量日期 A 包含每月日期 JX 包含季度日期 我希望将每月日期列 在 A A 中
  • Java 中转换为泛型类型时的警告

    我有一些通用代码 我无法弄清楚如何合法地防止收到警告 我目前正在使用 SuppressWarnings unchecked 因为似乎在没有警告的情况下无法完成泛型类型的转换 我怎样才能摆脱注释 我所拥有的是 public MyObject