5

特定のクラスがプリミティブ型をボックス化するクラスであるかどうかを知る方法はありますか、または次のような醜いメソッドを作成する必要がありますか?

public boolean isBoxingClass(Class clazz){
  String simpleName=clazz.getSimpleName();
  switch(simpleName){
    case "Integer":
    case "Long":
    case "Boolean":
    case "Double":
    case "Float":
      return true;
    default :
      return false;
  }
}

編集:

最終的にこのソリューションを選択した場合:

public static final List<Class> BOXING_CLASSES= Arrays.asList(new Class[]{
      Integer.class,
      Long.class,
      Short.class,
      Boolean.class,
      Double.class,
      Float.class,
      Character.class,
      Void.class,
      Byte.class});

public static boolean isBoxing(Class clazz){
  return BOXING_CLASSES.contains(clazz);
}
4

2 に答える 2

2

これは私が考えることができる最も簡単な方法です。java.langラッパー クラスはパッケージにのみ存在します。また、ラッパー クラスを除いて、 の他のクラスにjava.langは という名前の変数はありませんTYPE。これを使用して、クラスが Wrapper クラスかどうかを確認できます。

public static boolean isBoxingClass(Class<?> clazz)
{
    String pack = clazz.getPackage().getName();
    if(!"java.lang".equals(pack)) 
        return false;
    try 
    {
        clazz.getField("TYPE");
    } 
    catch (NoSuchFieldException e) 
    {
        return false;
    }           
    return true;        
}
于 2013-05-27T18:31:11.730 に答える
-1

クラスが Number を実装しているかどうか、それが Character であるか、Boolean であるかを調べるのはどうですか (これらが唯一のオプションだと思います)。

public boolean isBoxingClass(Class clazz)
{   
    return Number.class.isAssignableFrom(clazz) ||
           Character.class.isAssignableFrom(clazz) || 
           Boolean.class.isAssignableFrom(clazz);
}

この場合、たとえば次のようになります。BigDecimal と AtomicInteger も同様ですが、それが必要かどうかはわかりません。しかし、いずれにしても、getSimpleName() を実行する必要はありません。

于 2013-05-27T16:08:55.370 に答える