当您不知道类型时,将ExecContext <! - ? - >传递给方法

时间:2010-08-01 04:15:41

标签: java compiler-errors generics

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

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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

尝试这样做是件坏事。如果你不知道泛型类型是什么,你怎么知道传递String是否类型安全?

如果你真的想这样做,你必须在exec方法中添加适当的注释,告诉它抑制不安全/未检查的类型转换错误。但这只是在运行时将编译转换为潜在的ClassCastException,可能会被某些ExecContext子类型意外抛出,而doSomething方法会执行不同的操作。

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

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

因为编译器无法判断用于T的实际类型是String还是{假设的} String子类型。例如,假设exec被调用如下:

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

现在当exec调用doSomething方法时,它会传递一个String实例作为参数,其中doSomething方法的通用签名表示它应该通过E的一个实例;即Integer

答案 2 :(得分:0)

这不起作用,因为你传递的是ExecContext(类型为unknown),因此你不知道在编译时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
     }
  }

如果您传递未知或对象的执行上下文,那么任何方式都是泛型的吗?