2

我正在使用这样的泛型实现一个类:

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) {}
}

有可能这样做吗?

谢谢

4

3 回答 3

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;
}

等等

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

于 2012-12-18T13:29:17.217 回答
0

不,这是不可能的,Java 编译器强制使用泛型,你会得到编译错误

于 2012-12-18T13:28:20.677 回答
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);

或者 ...

于 2012-12-18T13:40:27.210 回答