Это плохо, чтобы пытаться сделать. Если вы не знаете, каким будет общий тип, как вы узнаете, безопасно ли использование кода 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
.
Возможно, вам нужно добавить общий метод 'exec' и использовать этот общий аргумент как общий аргумент для ExecContext. Я никогда не делал общие классы/методы в Java, поэтому я не уверен в синтаксисе, но это, вероятно, не сложно. – zneak