2014-11-18 6 views
0

Есть ли альтернативный способ идентификации экземпляра многомерного объекта без жесткого кода на нем?Как идентифицировать экземпляр многомерного объекта в java?

//source 
import java.util.LinkedList; 
import java.util.List; 

public class Test { 

    public static <T> boolean isPrimitiveWrapper(T p_obj) throws Exception { 
     if (Number.class.isInstance(p_obj) || Number[].class.isInstance(p_obj)) { 
      return true; 
     } else if (Boolean.class.isInstance(p_obj) || Boolean[].class.isInstance(p_obj)) { 
      return true; 
     } else if (Character.class.isInstance(p_obj) || Character[].class.isInstance(p_obj)) { 
      return true; 
     } 

     return false; 
    } 

    public static void main(String[] args) throws Exception { 
     Integer[][][] a = {{{0}}, {{1}}, {{0}}}; 

     println(isPrimitiveWrapper(a)); 
     println(isPrimitiveWrapper(a[0])); 
     println(isPrimitiveWrapper(a[0][0])); 
     println(isPrimitiveWrapper(a[0][0][0])); 
    } 

    public static <T> void println(T p_t) { 
     System.out.println(p_t); 
    } 

} 

//Actual Result 
false 
false 
true 
true 

//Expected Result 
true 
true 
true 
true 

Основываясь на приведенном выше примере, у нас нет никаких проблем, чтобы иметь дело с не-массивом & одного объекта одномерного массива, но не в состоянии идентифицировать многомерный массив объекты.

Это слишком уродливое для жесткого кодирования количество измерений.

+0

Как вы определяете «примитивную обертку»? Непонятно, что скрывается именно за вашей концепцией. –

ответ

0
public class Test { 

    public static <T> boolean isPrimitiveWrapper(T p_obj) throws Exception { 
     return isPrimitiveWrapper(p_obj.getClass()); 
    } 

    public static boolean isPrimitiveWrapper(Class p_obj) throws Exception { 
     if (Number.class.isAssignableFrom(p_obj)) { 
      return true; 
     } else if (Boolean.class.isAssignableFrom(p_obj)) { 
      return true; 
     } else if (Character.class.isAssignableFrom(p_obj)) { 
      return true; 
     } else if (p_obj.isArray()) { 

      //To handle multi dimension array 
      while (p_obj.isArray()) { 
       p_obj = p_obj.getComponentType(); 
      } 

      return isPrimitiveWrapper(p_obj); 
     } 

     return false; 
    } 

    public static boolean isPrimitiveWrapper(boolean p_obj) { 
     return false; 
    } 

    public static boolean isPrimitiveWrapper(byte p_obj) { 
     return false; 
    } 

    public static boolean isPrimitiveWrapper(short p_obj) { 
     return false; 
    } 

    public static boolean isPrimitiveWrapper(float p_obj) { 
     return false; 
    } 

    public static boolean isPrimitiveWrapper(int p_obj) { 
     return false; 
    } 

    public static boolean isPrimitiveWrapper(long p_obj) { 
     return false; 
    } 

    public static boolean isPrimitiveWrapper(char p_obj) { 
     return false; 
    } 

    public static boolean isPrimitiveWrapper(double p_obj) { 
     return false; 
    } 

    public static void main(String[] args) throws Exception { 
     Integer[][][] a = {{{0}}, {{1}}, {{0}}}; 
     int[][][] b = {{{0}}, {{1}}, {{0}}}; 

     println(isPrimitiveWrapper(a)); 
     println(isPrimitiveWrapper(a[0])); 
     println(isPrimitiveWrapper(a[0][0])); 
     println(isPrimitiveWrapper(a[0][0][0])); 

     println(isPrimitiveWrapper(b)); 
     println(isPrimitiveWrapper(b[0])); 
     println(isPrimitiveWrapper(b[0][0])); 
     println(isPrimitiveWrapper(b[0][0][0])); 
    } 

    public static <T> void println(T p_t) { 
     System.out.println(p_t); 
    } 

} 
0

Попробуйте этот подход. Наверное, это то, чего ты хочешь.
Но этот код выглядит как-то вроде хачка в любом случае
(что не обязательно плохо).

private static boolean isPrimitiveWrapper(Object obj){ 
    if (obj == null) { 
     return false; 
    } else { 
     String cls = obj.getClass().getCanonicalName(); 
     return "java.lang.Integer".equals(cls) || 
       cls.startsWith("java.lang.Integer[]"); 
    } 
} 

Вот еще один взлом. Оба кода должны работать нормально, хотя.

private static boolean isPrimitiveWrapper(Object obj){ 
    if (obj == null) { 
     return false; 
    } else { 
     String cls = obj.getClass().getName(); 
     cls = cls.replaceAll(";", ""); 
     return cls.matches("\\[*L?java\\.lang\\.Integer"); 
    } 
} 
+0

Рассмотрите 'IntegerUtils' –

+0

@DmitryGinzburg Да, я только что рассмотрел это. –

+0

Как насчет экземпляров 'mypackage.MyFooBarInteger'? –

1

Там нет стандартного способа определить, если сам класс обертку для примитивного типа или нет, так что вы можете сделать что-то вроде этого:

private static final Set <Class <?>> primitiveWrappers; 

static { 
    Set <Class <?>> tmp = new HashSet<>(); 
    tmp.add (Integer.class); 
    tmp.add (Boolean.class); 
    tmp.add (Character.class); 
    tmp.add (Long.class); 
    tmp.add (Double.class); 
    tmp.add (Float.class); 
    // ... have I forgotten smth? 
    primitiveWrappers = Collections.unmodifiableSet(tmp); 
} 

private static boolean isPrimitiveWrapperOrArrayOf(Object o) { 
    if (o.getClass().isArray()) 
     return isPrimitiveWrapperOrArrayOf(o.getClass().getComponentType()); 
    else 
     return primitiveWrappers.contains(o.getClass()); 
} 

При запуске isPrimitiveWrapperOrArrayOf, класс проверяя его массив, если это так, мы проверим его тип компонента (например, Integer [] для Integer [] []) в той же функции isPrimitiveWrapperOrArrayOf, поэтому таким образом мы достигнем всего SomeClass , который будет проверяться, если он содержится внутри жесткого кода primitiveWrappers

Кстати, вы можете взглянуть на Commons Lang, ClassUtils.wrapperToPrimitive может решить вашу проблему.

Смежные вопросы