gpt4 book ai didi

java - 转换为通用类型时 Java 中的警告

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:04 24 4
gpt4 key购买 nike

我有一些通用代码,我不知道如何合法地防止收到警告;我目前正在使用 @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);
...
}

protected 变量上下文是类型 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 放入公共(public)实用程序类 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));
...
}

关于java - 转换为通用类型时 Java 中的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2301050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com