代码之家  ›  专栏  ›  技术社区  ›  TraderJoeChicago

传递execContext<?>当你不知道类型的时候

  •  0
  • TraderJoeChicago  · 技术社区  · 14 年前

    当我不知道类型时,如何将泛型类型传递给方法?

    public static class ExecContext<E> {
    
        public void doSomething(E e) {
    
            System.out.println(e);
        }
    }
    
    public static void exec(ExecContext<?> ctx) {
    
        String s = new String("saoj");
    
        ctx.doSomething(s); // <============== COMPILE ERROR
    }
    
    3 回复  |  直到 14 年前
        1
  •  3
  •   TofuBeer    14 年前
    public static <T> void exec(ExecContext<T> ctx)
    

    应该这样做。

    编辑:

    应该这样做…不过,您的工作方式略有改变:

    public class Main
    {
        public static void main(String[] args)
        {
            final ExecContext<String>  stringCtx;
            final ExecContext<Integer> integerCtx;
    
            stringCtx  = new ExecContext<String>();
            integerCtx = new ExecContext<Integer>();
            exec(stringCtx, "Hello, World");
            exec(integerCtx, 42);
        }
    
        public static class ExecContext<T>
        {
            public void doSomething(final T e)
            {
                System.out.println(e);
            }
        }
    
        public static <T> void exec(final ExecContext<T> ctx,
                                    final T              value)
        {
            ctx.doSomething(value);
        }
    }
    
        2
  •  0
  •   naikus    14 年前

    这将不起作用,因为您正在传递ExecContext(类型未知),所以您不知道在编译时ExecutionContext持有什么类型。

    你必须这样做:

    public class Test {
    
         public static class ExecContext<E> {
    
             public void doSomething(E e) {
    
                 System.out.println(e);
             }
         }
    
         public static void exec(ExecContext<Object> ctx) {
    
             String s = new String("saoj");
    
             ctx.doSomething(s); // <============== NO COMPILE ERROR
         }
      }
    

    如果传递未知或对象的执行上下文,那么泛型的意义是什么?

        3
  •  0
  •   Stephen C    14 年前

    这是一件很糟糕的事情。如果不知道泛型类型将是什么,如何知道是否传递 String 类型安全吗?

    如果您真的想这样做,您必须将适当的注释添加到 exec 方法来指示它禁止不安全/未选中的类型转换错误。但这只是把编译变成了一种可能 ClassCastException 在运行时,可能会被 ExecContext 它在 doSomething 方法。

    编辑 我认为以下内容也不正确:

        public static <T> void exec(ExecContext<T> ctx) {
            String s = new String("saoj");
            ctx.doSomething(s);
        }
    

    因为编译器不能告诉 T . 例如,假设 执行程序 调用如下:

        ExecContext<Integer> ctx = ...;
        exec(ctx);
    

    现在什么时候 执行程序 调用 剂量测定法 方法,它将通过 实例作为参数,其中 剂量测定法 方法表示它应该传递 E 也就是说 Integer .