我正在使用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) {}
}
可以这样做吗?
由于
答案 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);
或......