簡體   English   中英

Java泛型-子類型檢查?

[英]Java Generic - subtypes check?

如何檢查作為參數傳遞的通用子類型?

例如:

public class A<T> { public T get();}
public class AString extends A<String> {}
public class ADate extends A<Date> {}

public void checkparam(List<? extends A<?>> params) {
///Want to check if params is of type List<AString> or List<ADate> ?
}

可能嗎? 我不了解哪一部分?

這是不可能的,因為這樣的通用類型信息已刪除並且在運行時不可用。 在運行時,只知道checkparam的參數是List

我不認為您可以直接在清單上進行操作。 您可以檢查第一個元素:

if (!params.isEmpty() && params.get(0) instanceof AString) {
   // it's List<AString>
}
...

不漂亮,不能在空列表上使用,但應該可以使用。

通過嘗試編譯以下代碼可以清楚地看出這一點:

import java.util.Date;
import java.util.List;

public class A<T> { 
    private T value;

    public T get() {
        return value;
    }

    public void checkparam(List<AString> list) {

    }

    public void checkparam(List<ADate> list) {

    }
}
class AString extends A<String> {}
class ADate extends A<Date> {}

從javac產生以下輸出:

$ javac A.java 
A.java:11: name clash: checkparam(java.util.List<AString>) and checkparam(java.util.List<ADate>) have the same erasure
    public void checkparam(List<AString> list) {
                ^
A.java:15: name clash: checkparam(java.util.List<ADate>) and checkparam(java.util.List<AString>) have the same erasure
    public void checkparam(List<ADate> list) {
                ^
2 errors

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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