2013-07-12 28 views
10

Giả sử tôi có một mảng int [] [] hoặc một mảng char [] [] hoặc một ArrayList. Có cách nào trong java để biết loại lớp cơ sở của mảng. Ví dụ:Xác định loại đối tượng trong một tập hợp hoặc mảng

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) 

Điều này có thể được thực hiện bằng Java không?

+3

'ArrayList 'là sai, phải được' ArrayList ' – ajduke

+0

Không biết làm thế nào ông đã đến "biên dịch" – mattbdean

+3

Nó không phải là một mã số để nó sẽ không biên dịch. – Rishi

Trả lời

13

Mảng (ví dụ int[][])

Bạn có thể nhận được loại thành phần của mảng bằng getComponentType():

(new int[10][10]).getClass().getComponentType().getComponentType(); // int 

Đối với mảng có độ sâu tùy ý, sử dụng vòng lặp:

Object array = new int[10][][][]; 
Class<?> type = array.getClass(); 
while (type.isArray()) 
{ 
    type = type.getComponentType(); 
} 
assert type == Integer.TYPE; 

Loại chung (ví dụ: ArrayList<Integer>)

Không thể lấy thông số loại. Java sử dụng type erasure, vì vậy thông tin bị mất khi chạy.

Bạn có thể đoán kiểu tuyên bố của bộ sưu tập dựa trên các loại của các yếu tố:

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 
    } 
} 
+0

Cảm ơn bạn! Làm việc như một say mê. – wolf97084

0

Có, chúng được gọi là Generics. Nhưng tốt hơn là nghĩ rằng nó buộc Arraylist chỉ giữ các đối tượng "điểm".

2

Trong trường hợp mảng, nó có thể được xác định thông qua các loại hình một array, (ví dụ array của int[][] sẽ luôn luôn cung cấp cho bạn int.

Trong trường hợp ArrayList, nếu ArrayList của bạn là đối tượng không đồng nhất sau đó, get(i) sẽ luôn cung cấp cho bạn các yếu tố của loại Object để biết các lớp học, bạn có thể sử dụng phương pháp getClass()Object

0

Bạn có thể nhận loại hình cơ bản của mảng như:

Object obj = new Long[0]; 
Class ofArray = obj.getClass().getComponentType(); 

Đối với loại sưu tập, bạn có thể sử dụng phương thức getClass() hoặc bạn có thể sử dụng instanceof. Ví dụ:

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); 
    } 
    ... 
} 
5

Bạn có thể sử dụng các lớp getComponentType(). Ví dụ.

public static final Class<?> getBaseType(Object obj) { 
    Class<?> type = obj.getClass(); 
    while (type.isArray()) { 
     type = type.getComponentType(); 
    } 
    return type; 
} 

type sau đó sẽ là bất kỳ loại cơ sở nào.

Điều này sẽ hoạt động nếu objdouble[][][][][][] hoặc chỉ double[] hoặc thứ khác.

Đối với generics, những thứ đó trong <>. Loại tẩy xóa xảy ra, có nghĩa là bạn không thể xác định loại đó là gì từ chính số ArrayList.

+0

Hình như tom mượn câu trả lời của tôi và kết hợp nó vào của riêng mình. :) – Chase

+0

Chỉ để hoàn thành - Tôi hy vọng bạn không phiền. Và dù sao, không phải là tôi đã đề nghị sử dụng 'isArray()'? – tom

+0

Tất nhiên, tôi không bận tâm. Tôi chỉ thấy nó thú vị. Tôi đã viết phần còn lại của nó mặc dù, và cách của tôi để xác định nếu nó là một mảng cũng làm việc. – Chase

0

Đối với các loại nguyên thủy, bạn có thể sử dụng mã này:

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()); 
} 

đầu ra là:

int[] 
int[][] 
char[] 

Đối với ArrayList nếu bạn cần phải làm việc với các yếu tố của nó (nếu danh sách không có sản phẩm nào), bạn có thể kiểm tra loại phần tử đầu tiên

ArrayList<Integer> arrInt = new ArrayList<Integer>(); 
    arrInt.add(100); 

    if (arrInt instanceof List && arrInt.size() > 0) { 
     System.out.println(arrInt.get(0).getClass().getCanonicalName()); 
    } 
1

Mã sau hoạt động ... như bạn đã hỏi ..

Ở đây, tôi đã sử dụng

object.getClass(). GetSimpleName()

cho ArrayList bạn phải thêm một mục của loại hình cụ thể kể từ khi bạn đang sử dụng Generics. và sau đó lấy chúng và sử dụng cùng phương thức 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 { 

    } 

hy vọng nó sẽ giúp

+0

Đây là cách dễ dàng hơn để bạn có thể đạt được những gì bạn đã yêu cầu. – artapart

+0

@tom Tôi biết rằng nó sẽ không hoạt động với các loại chung với Bộ sưu tập trống. Nhưng ở đây câu hỏi đặt ra là về điều này ... nên tôi đã đưa ra câu trả lời. – artapart

Các vấn đề liên quan