java – 确定集合或数组中对象的类型
发布时间:2020-08-03 11:24:42  所属栏目:Java  来源:互联网 
            导读:假设我有一个数组int [] []或数组char [] []或一个ArrayList.有没有办法在 java中知道数组的基类类型.例如: int[][] gives output as int.char[][] gives output as char.ArrayListInteger gives output Integer.ArrayListPoint gives Point.
                
                
                
            | 
                         假设我有一个数组int [] []或数组char [] []或一个ArrayList.有没有办法在 java中知道数组的基类类型.例如: int[][] gives output as int. char[][] gives output as char. ArrayList<Integer> gives output Integer. ArrayList<Point> gives Point. (It should also work for a custom type) 这可以在Java中完成吗? 解决方法数组(例如int [] [])您可以使用getComponentType()获取阵列的组件类型: (new int[10][10]).getClass().getComponentType().getComponentType(); // int 对于任意深度的数组,使用循环: Object array = new int[10][][][];
Class<?> type = array.getClass();
while (type.isArray())
{
    type = type.getComponentType();
}
assert type == Integer.TYPE; 
 通用类型(例如ArrayList< Integer>) 不可能得到类型参数. Java使用type erasure,所以信息在运行时丢失. 您可以根据元素的类型来猜测所声明的集合类型: import java.util.*;
public class CollectionTypeGuesser
{
    static Set<Class<?>> supers(Class<?> c)
    {
        if (c == null) return new HashSet<Class<?>>();
        Set<Class<?>> s = supers(c.getSuperclass());
        s.add(c);
        return s;
    }
    static Class<?> lowestCommonSuper(Class<?> a,Class<?> b)
    {
        Set<Class<?>> aSupers = supers(a);
        while (!aSupers.contains(b))
        {
            b = b.getSuperclass();
        }
        return b;
    }
    static Class<?> guessElementType(Collection<?> collection)
    {
        Class<?> guess = null;
        for (Object o : collection)
        {
            if (o != null)
            {
                if (guess == null)
                {
                    guess = o.getClass();
                }
                else if (guess != o.getClass())
                {
                    guess = lowestCommonSuper(guess,o.getClass());
                }
            }
        }
        return guess;
    }
    static class C1 { }
    static class C2 extends C1 { }
    static class C3A extends C2 { }
    static class C3B extends C2 { }
    public static void main(String[] args)
    {
        ArrayList<Integer> listOfInt = new ArrayList<Integer>();
        System.out.println(guessElementType(listOfInt)); // null
        listOfInt.add(42);
        System.out.println(guessElementType(listOfInt)); // Integer
        ArrayList<C1> listOfC1 = new ArrayList<C1>();
        listOfC1.add(new C3A());
        System.out.println(guessElementType(listOfC1)); // C3A
        listOfC1.add(new C3B());
        System.out.println(guessElementType(listOfC1)); // C2
        listOfC1.add(new C1());
        System.out.println(guessElementType(listOfC1)); // C1
    }
}                        (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
