簡體   English   中英

具有多個聲明的 Java 泛型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM