假设我有一个数组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 } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。