11

配列 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 で実行できますか?

4

8 に答える 8

16

配列(例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 はタイプ eraserを使用するため、情報は実行時に失われます。

要素の型に基づいて、宣言されたコレクションの型を推測できます。

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
    }
}
于 2013-07-12T05:37:48.070 に答える
2

配列の場合、 , のタイプで識別できますarray(たとえばarray、 ofint[][]は常にint.

の場合、ArrayList異種ArrayListオブジェクトの場合、get(i)は常にタイプ の要素を提供しますObject。そのクラスを知るには、getClass()のメソッドを使用できますObject

于 2013-07-12T05:35:03.423 に答える
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 {

    }

それが役に立てば幸い

于 2013-07-12T06:44:00.560 に答える
0

これを行うには 2 つの方法があります。

  1. 演算子を使用しinstanceofます。

  2. オブジェクトを呼び出しgetClass()ます (最初に null を確認してください)。

これについては、私が見つけたものを参照することもできます: http://docs.oracle.com/javase/tutorial/reflect/class/classNew.html

于 2013-07-12T05:36:03.323 に答える
0

はい、それらはジェネリックと呼ばれます。ただし、Arraylist が「ポイント」オブジェクトのみを保持するように強制すると考えたほうがよいでしょう。

于 2013-07-12T05:33:52.153 に答える