代码之家  ›  专栏  ›  技术社区  ›  L. Cornelius Dol

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

  •  8
  • L. Cornelius Dol  · 技术社区  · 16 年前

    我有一些通用代码,我无法弄清楚如何合法地防止收到来自的警告;我目前正在使用@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);
    
    5 回复  |  直到 16 年前
        1
  •  3
  •   L. Cornelius Dol    16 年前

    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;
        }
    

    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));
        ...
        }
    
        2
  •  2
  •   finnw    16 年前

    Map<String, Pair<String, Boolean>> SharedContext TreeMap ForwardingMap Guava

    class InputFieldMap extends ForwardingMap<String,Pair<String,Boolean>> {
    
        private final Map<String,Pair<String,Boolean>> delegate =
            Maps.newTreeMap(String.CASE_INSENSITIVE_ORDER);
        protected Map<String,Pair<String,Boolean>> delegate() { return delegate; }
    
    }
    
    // ...
    
    context.set("Input Fields"  ,Collections.synchronizedMap(new InputFieldMap()));
    
    // ...
    
    inputFields     =(InputFieldMap)context.get("Input Fields"  ,null);
    outputFields    =(Map<?,?>     )context.get("Output Fields" ,null);
    

    String bar = String.valueOf(outputFields.get("foo"));
    

    Map<?, String> wrappedOutputFields    =
        Maps.transformValues(outputFields, Functions.toStringFunction());
    
    // ...
    
    String bar = wrappedOutputFields.get("foo");
    
        3
  •  1
  •   Steve McLeod    16 年前

    context.setInputFields(...)
    context.setOutputFields(...)
    context.setEventRegistry(...)
    context.getInputFields()
    etc.
    

        4
  •  0
  •   Amir Afghani    16 年前

    context

    SharedContext<Object>