Передача ExecContext <?> Методу, когда вы не знаете тип - PullRequest
0 голосов
/ 01 августа 2010

Как я могу передать универсальный тип методу, если я не знаю тип?

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 ]

3 голосов
/ 01 августа 2010
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);
    }
}
0 голосов
/ 01 августа 2010

Это не будет работать, потому что вы передаете 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
     }
  }

В любом случае, какой смысл в обобщениях, если вы передаете контекст выполнения неизвестного или объекта?

0 голосов
/ 01 августа 2010

Плохо пытаться делать. Если вы не знаете, каким будет общий тип, как вы узнаете, если передача 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...