2009-11-09 17 views
19

メソッドのフィールドのクラスを渡す必要があるコードがあります。私のコードの仕組みのため、プリミティブではなく参照オブジェクトのみを扱うことができます。 Fieldの型がプリミティブであるかどうかを判断し、適切なラッパークラスと交換する簡単な方法が必要です。Javaでラッパークラスの型を取得する簡単な方法

Field f = getTheField(); // Dummy method that returns my Field 
Class<?> c = f.getType(); 
if (c == int.class) { 
    c = Integer.class; 
} 
else if (c == float.class) { 
    c = Float.class; 
} 
// etc 
myMethod(c); 

これは私が明示的にすべてのプリミティブ型をチェックして、適切なラッパークラスでそれらを交換する必要があるという事実を除いて、正常に動作します:だから私は、これまでに何をすべきかのコードでこのようなものです。今では、あまりにも多くのプリミティブ型がないことを知っています。単純にそれらをすべてリストするのは問題ではありませんが、より簡単でより洗練された方法があれば疑問に思っていました。

答えて

33

私はそのように甘やかされているので私の答えではGoogle Collections Libraryを使用していますが、もしあなたが好きなのであれば、普通のHashMapsでどうやってそれを行うのか分かります。

// safe because both Long.class and long.class are of type Class<Long> 
    @SuppressWarnings("unchecked") 
    private static <T> Class<T> wrap(Class<T> c) { 
    return c.isPrimitive() ? (Class<T>) PRIMITIVES_TO_WRAPPERS.get(c) : c; 
    } 

    private static final Map<Class<?>, Class<?>> PRIMITIVES_TO_WRAPPERS 
    = new ImmutableMap.Builder<Class<?>, Class<?>>() 
     .put(boolean.class, Boolean.class) 
     .put(byte.class, Byte.class) 
     .put(char.class, Character.class) 
     .put(double.class, Double.class) 
     .put(float.class, Float.class) 
     .put(int.class, Integer.class) 
     .put(long.class, Long.class) 
     .put(short.class, Short.class) 
     .put(void.class, Void.class) 
     .build(); 

これはJDKには何も存在しませんが、実際には何もありません。

EDIT:それはラップ()メソッド、プラスアンラップ()および他のいくつかの偶発的なものを持っている

http://google.github.io/guava/releases/21.0/api/docs/com/google/common/primitives/Primitives.html

:私は完全に我々はこれを解放することを忘れてしまったと思います。

+0

だから基本的に同じこと... :)答えをありがとう。基本的には今のところ他の方法はありません。 –

6

class.isPrimitive()を呼び出してプリミティブであるかどうかを知ることができますが、JDK内のクラスを変換するボクシングメソッドはありません。これに関連する少なくとも1つのopen bugがあります。

+0

ラッパークラスには、プリミティブクラスを得るためのフィールドもあります(例えば 'Double.TYPE'は'double.class'と同じですが)、プログラム的にそれを利用するという面白い方法はありません。 –

33

Apache Commons Langにはこれを行うためのユーティリティメソッドがあります(ClassUtils.primitiveToWrapper())が、これはちょうどカバーの下では醜いでしょうが、少なくともそれは素敵です。あなたは、高度に最適化されたコードを必要としない場合はここで

5

は別の方法です:

Class<?> primitive=long.class; 
    Class<?> boxed=Array.get(Array.newInstance(primitive,1),0).getClass(); 
    System.out.println(primitive.getName()); 
    System.out.println(boxed.getName()); 
0

com.sun.beans.finder.PrimitiveWrapperMap#のgetType(primitiveName)もあります。 もちろん、 "com.sun"パッケージのクラスを使用することはお勧めできません。

関連する問題