当我不知道类型时,如何将泛型类型传递给方法?
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 :(得分: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
}
}
如果您传递未知或对象的执行上下文,那么任何方式都是泛型的吗?