在转换为泛型类型时在Java中发出警告 [英] Warnings in Java when casting to a generic type
问题描述
我有一些通用代码,我无法弄清楚如何合法地防止从警告中获得警告;我现在正在使用@SuppressWarnings(unchecked),因为它似乎不能在没有警告的情况下投射泛型。
I have some generic code which I cannot figure out how to legitimately prevent getting warnings from; I am using @SuppressWarnings("unchecked") for the moment, since it seems that casting a generic type can't be done without warnings.
我该如何摆脱的注释?
我的是:
What I have is:
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>
。
The protected variable context is type SharedContext<Object>
.
没有注解,编译器会给出警告:
Without the annotation the compiler gives warnings:
...\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);
推荐答案
经过一些进一步的研究,我相信我找到了合理的替代方法,它至少将抑制注释限制为只有一个全局静态工具方法来执行未经检查的强制转换。
After some further research I believe I have found a reasonable alternative, which at least limits the suppression annotation to just one global static utility method to do an unchecked cast.
下面的自包含测试程序应该足够清楚:
The self contained test program which follows should be clear enough:
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;
}
}
另一个博客提出了对此的改进实用程序方法:
Another blog suggested an improvement to this utility method:
@SuppressWarnings("unchecked")
public static <T, X extends T> X uncheckedCast(T o) {
return (X) o;
}
强制返回的是传入的参数的子类。
forcing what is returned to be a subclass of the parameter passed in.
假设我将uncheckedCast放入公共实用类GenUtil,那么在问题中我的启动方法将没有(无用的)警告发出,并且看起来像:
Assuming I put uncheckedCast into public utility class GenUtil, my startup method in the question would have no (useless) warnings emitted and look like:
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中发出警告的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!