2010-08-01 2 views
0

Как передать общий тип методу, когда я не знаю тип?Передача ExecContext <?> методу, когда вы не знаете тип

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 
} 
+0

Возможно, вам нужно добавить общий метод 'exec' и использовать этот общий аргумент как общий аргумент для ExecContext. Я никогда не делал общие классы/методы в Java, поэтому я не уверен в синтаксисе, но это, вероятно, не сложно. – zneak

ответ

3
public static <T> void exec(ExecContext<T> ctx) 

должны это сделать.

Edit:

Это должно сделать это ... небольшое изменение, как вы делаете это, хотя:

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

Голосовали за вас! Спасибо! – TraderJoeChicago

0

Это плохо, чтобы пытаться сделать. Если вы не знаете, каким будет общий тип, как вы узнаете, безопасно ли использование кода String?

Если вы действительно хотите это сделать, вы должны добавить соответствующую аннотацию к методу exec, чтобы сообщить ему, чтобы подавить ошибку небезопасного/неконтролируемого преобразования типа. Но это просто превращает компиляцию в потенциальный ClassCastException во время выполнения, которая может быть неожиданно вызвана некоторым подтипом ExecContext, который делает что-то другое в методе doSomething.

EDIT Я не думаю, что следующее является правильным либо:

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.

0

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

Любой путь какой смысл дженериков, если вы передаете контекст выполнения неизвестен или объект?

Смежные вопросы