[英]Java Generics with multiple declarations
我正在使用這樣的泛型實現一個類:
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) {}
}
有可能這樣做嗎?
謝謝
不,你不能。
您應該將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;
}
等等。
顯然,選擇一個更合理的名稱來反映您要解決的問題。
不,這是不可能的,Java 編譯器強制執行泛型,你會得到編譯錯誤
不可以,泛型類的所有實例的類型和方法參數的數量必須相同。
如果我們知道您要實現的目標,我們可能會建議替代方案。 例如,如果這是關於將任務提交到線程池,您可以執行以下操作:
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);
或者 ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.