具有多个声明的Java泛型

时间:2012-12-18 13:24:00

标签: java generics

我正在使用Generics实现一个类:

public abstract class AbstractTask<T,V>
{
  public void method1 (T param1, V param2) {}
}

声明<T,K>可以变量吗?我想通过这种方式扩展这个类:

public class TaskOne extends AbstractTask<Integer,String>
{
  public void method1 (Integer param1, String param2) {}
}

public class TaskTwo extends AbstractTask<Number,Object,Double>
{
  public void method1 (Number param1, Object param2, Double param3) {}
}

可以这样做吗?

由于

3 个答案:

答案 0 :(得分:2)

不,你不能。

您应该将V从普通java.lang类型更改为参数的包装。

public class TaskOne extends AbstractTask<Integer,StringWrapper>
{
  public void method1 (Integer param1, StringWrapper param2) {}
}

public class TaskTwo extends AbstractTask<Number,ObjectAndDoubleWrapper>
{
  public void method1 (Number param1, ObjectAndDoubleWrapper param3) {}
}

class ObjectAndDoubleWrapper {
    Object obj;
    Double doub;
}

显然,选择一个更明智的名称来反映你想要解决的问题。

答案 1 :(得分:0)

不可能,Java编译器强制执行泛型,您将收到编译错误

答案 2 :(得分:0)

不,对于泛型类的所有实例,类型和方法参数的数量必须相同。

如果我们知道您要完成的任务,我们可能会建议替代方案。例如,如果这是关于向线程池提交任务,您可以执行以下操作:

final int x = ...;
final String y = ...;
final Number n = ...;
new Runnable {
    @Override public void run() {
        // do something with x, y and n
    }
}

或者您可以使用AOP代理捕获参数。

或者(如果你不需要类型安全),你可以简单地拥有

void method1(Object... args);

或......