簡體   English   中英

如何從Java中的泛型列表中獲取參數類型?

[英]How can I get parameter Type from generic list in Java?

我有這樣的代碼:

List<TRt> listTrt;
List<TRtKuesioner> listTrtKuesioner;
List<TArtKuesioner> listTArtKuesioner;
Object[] objects = new Object[] { 
    listTrt, listTrtKuesioner,listTArtKuesioner 
};

我怎樣才能像下面的願望那樣運作:

for(Object o :objects){
    if(o instanceof List<TRt>){

    }else if(o instanceof List<TRtKuesioner>){


    }else if(o instanceof List<TArtKuesioner>){


    }
}

我怎么能做到這一點?

由於稱為類型擦除的過程,泛型類型的類型參數在運行時不可用。 簡而言之,類型擦除是編譯器刪除類型參數並在適當時替換with轉換的過程。

請參閱: http//docs.oracle.com/javase/tutorial/java/generics/erasure.html

如果列表非空,您可以使用它進行模擬

if(((List)o).get(0) instanceof TRt)

但更好的想法是嘗試完全避免Object數組。 你想做什么?

您可以使用isAssignableFrom進行模擬,以檢查第一個元素,然后轉換整個List。

例如:

public static void main(String[] args) throws Exception {
        List<String> strings = new ArrayList<String>();
        strings.add("jora string");
        List<Integer> ints = new ArrayList<Integer>();
        ints.add(345);
        Object[] objs = new Object[]{strings,ints};
        for (Object obj : objs){
            if (isListInstanceOf(obj, String.class)){
                List<String> strs = castListTo(obj, String.class);
                for (String str : strs){
                    System.out.println(str);
                }
            }else if (isListInstanceOf(obj, Integer.class)){
                List<Integer> inList = castListTo(obj, Integer.class);
                for (Integer integ : inList){
                    System.out.println("Int: "+integ);
                }
            }
        }
    }


    public static boolean isListInstanceOf(Object list, Class clazz){
        return (list instanceof List && ((List)list).size() > 0) ? ((List)list).get(0).getClass().isAssignableFrom(clazz) : false;
    }

    public static <T> List<T> castListTo(Object list, Class<T> clazz){
        try{
            return (List<T>)list;
        }catch(ClassCastException exc){
            System.out.println("can't cast to that type list");
            return null;
        }
    }

暫無
暫無

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

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