假设我有一个数组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完成吗?
答案 0 :(得分:15)
数组(例如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>
)
无法获取type参数。 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
}
}
答案 1 :(得分:6)
您可以使用班级getComponentType()
。例如。
public static final Class<?> getBaseType(Object obj) {
Class<?> type = obj.getClass();
while (type.isArray()) {
type = type.getComponentType();
}
return type;
}
type
将是基本类型。
如果obj
为double[][][][][][]
或仅double[]
或其他内容,则此方法有效。
至于泛型,<
和>
中的那些内容。发生类型擦除,这意味着您无法确定ArrayList
本身的类型。
答案 2 :(得分:2)
如果是数组,可以通过array
的类型进行识别,(例如array
int[][]
将始终为您提供int
。
如果是ArrayList
,如果您的ArrayList
是异构对象,那么get(i)
将始终为您提供Object
类型的元素。要了解其类,您可以使用getClass()
的{{1}}方法。
答案 3 :(得分:1)
以下代码有效...正如您所问...
在这里,我使用了
object.getClass()。getSimpleName()
对于arraylist,您必须添加特定类型的项目,因为您使用的是泛型。然后得到它们并让它使用相同的getClass()。getSimpleName()方法。
public class ShowObjectType {
public static void main(String[] args) {
int arr[][] = { { 2, 3 }, { 4, 0 } };
char[][] arr1 = { { 'a', 'c' }, { 'b', 'd' } };
ArrayList<Integer> arr2 = new ArrayList<Integer>();
arr2.add(4);
ArrayList<Point> arr3 = new ArrayList<Point>();
arr3.add(new Point());
System.out.println(arr.getClass().getSimpleName());
System.out.println(arr1.getClass().getSimpleName());
System.out.println(arr2.get(0).getClass().getSimpleName());
System.out.println(arr3.get(0).getClass().getSimpleName());
}
}
class Point {
}
希望有所帮助
答案 4 :(得分:0)
是的,这些被称为泛型。但最好还是认为它迫使Arraylist只持有&#34; point&#34;对象。
答案 5 :(得分:0)
两种方法:
使用instanceof
运算符。
在对象上调用getClass()
(确保先检查为null)。
为此您还可以参考我找到的内容: http://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
答案 6 :(得分:0)
您可以将基本类型的数据作为:
Object obj = new Long[0];
Class ofArray = obj.getClass().getComponentType();
对于Collection类型,您可以使用getClass()方法,也可以使用instanceof。例如:
ArrayList<Object> list = ...;
for (Object obj : list) {
if (obj instanceof String) {
...
}
}
for (Object o : list) {
if (o.getClass().equals(Integer.TYPE)) {
handleInt((int)o);
}
else if (o.getClass().equals(String.class)) {
handleString((String)o);
}
...
}
答案 7 :(得分:0)
对于基本类型,您可以使用以下代码:
public static void main(String[] args) {
int arr[] = {1,2,3};
int arr2[][] = {{1},{2},{3}};
char arrc[] = {'v', 'c', 'r'};
System.out.println(arr.getClass().getCanonicalName());
System.out.println(arr2.getClass().getCanonicalName());
System.out.println(arrc.getClass().getCanonicalName());
}
输出是:
int[]
int[][]
char[]
对于ArrayList,如果你需要使用它的元素(如果列表不为空),你可以检查第一个元素的类型
ArrayList<Integer> arrInt = new ArrayList<Integer>();
arrInt.add(100);
if (arrInt instanceof List && arrInt.size() > 0) {
System.out.println(arrInt.get(0).getClass().getCanonicalName());
}