2012-12-18 148 views
2

我执行使用泛型这样的类:Java泛型与多个声明

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

你试图去编译它?我猜'TaskTwo'不会编译 –

+1

这是不可能的。这是非常不清楚你想在这里实现什么。 – Flavio

+0

感谢您的所有答案。我认为最好的选择是使用meriton命题:void method1(Object ... args) – user1151816

回答

0

不,它是不可能的,Java编译器强制仿制药,你会得到编译错误

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

显然,挑选反映你正在试图解决这个问题一个更明智的名称。

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

或者......