java 判定 プリミティブ - Java汎用クラス - 型を判別する




4 Answers

私はいくつかのプロジェクトについてここで説明したことと同様の解決策を使用しており、非常に有用であることがわかりました。

http://blog.xebia.com/2009/02/07/acessing-generic-types-at-runtime-in-java/

それのjistは次のものを使用しています:

 public Class returnedClass() {
     ParameterizedType parameterizedType = (ParameterizedType)getClass()
                                                 .getGenericSuperclass();
     return (Class) parameterizedType.getActualTypeArguments()[0];
}
class型 否定

ジェネリックであるようにJavaクラスを作成している場合は、次のようになります。

public class Foo<T>

どのようにしてそのクラスの内部的に判断することができますか?

public ???? Bar()
{
    //if its type 1
    //    do this
    //if its type 2
    //    do this
    //if its type 3
    //    do this
    //if its type 4
    //    do this
}

私はJava APIの周りを突き刺して、Reflectionのstuff、instanceof、getClass、.classなどで演奏しましたが、頭や尾を作ることはできません。 私は近くにいるように感じていて、いくつかのコールを組み合わせるだけでいいですが、短くしていきます。

具体的には、クラスが3つのタイプのうちの1つでインスタンス化されているかどうかを判断しようとしています。




型の消去のため、これを直接行う方法はありません。 しかし、あなたができることは、 Class<T>をコンストラクタに渡し、 Class<T>の中でそれを保持することです。 次に、あなたが許可する3つの可能なClassタイプに対してそれをチェックすることができます。

ただし、可能なタイプが3つしかない場合は、代わりにリファクタリングをenum型にすることを検討してください。




意味のあるいくつかの特定の型が分かっている場合は、実装でジェネリック型のサブクラスを作成する必要があります。

そう

public class Foo<T>

public ???? Bar()
{
    //else condition goes here
}

その後

public class DateFoo extends Foo<Date>

public ???? Bar()
{
    //Whatever you would have put in if(T == Date) would go here.
}



実際にはGenericクラスではなく、いくつかの実装が異なるインターフェイスが必要です。 しかし、あなたが実際の具体的な目標を述べていれば、それはもっと明確になるでしょう。




Related