2016-12-05 6 views
0

型Tまたはタイプのリストを持つことができるジェネリッククラスを定義するために私のJavaのジェネリックは離れて長い時間が経過した後のJavaに戻っさびです。 どのよう<T>

は、私は私が午前問題は、時にはTがクラスのインスタンスであるということである ObjectMapper

abstract class MyBaseClass<T> { 
    private Class<T> clazz; 
    public void read() { 
     objectMapper.readValue(json, clazz) 
    } 

    abstract Class<T> getGenericTypeClass(); 
} 

ジャクソンズをラップするために、一般的な基本クラスを作成しようとしています、そして時にはそれがList<T>にする必要があります。私のコードは前者のために働いていますが、リストのシナリオがあるときにコンパイルすることはできません。したがって、この

class Sub extends MyBaseClass<Thing> { 
    @Override 
    getGenericTypeClass() { 
     return Thing.class; 
    } 
} 

が正常に動作しますが、私はList<Thing>を必要とするとき、私は少し迷ってしまいました。

+1

'List 'が必要な場合は、タイプトークン(http://stackoverflow.com/a/75345/2413303より)を検討する必要があります - 私はそれら[ここ]でhttp://stackoverflow.com/a/30096160/2413303)、それが助けになるかどうかわかりません。 – EpicPandaForce

+0

'Thing.class'がありますが、そこ'一覧 .class'のみ 'List.class'はありませんので、' 'の型情報が失われてしまいます。あなたが使っているこの外部ライブラリには、そのようなケースに対処するためのいくつかの他のAPIがあるかもしれません。この場合、実際にはライブラリに依存します。 –

+0

しかし、[この記事](https://bthurley.wordpress.com/2012/07/18/accessing-generic-type-in​​fo-at-runtime/)とSpringの 'GenericTypeResolver'を見ることもできます – EpicPandaForce

答えて

1

あなたがすることはできません。そして、あなたはすべきではありません。 ThingList<Thing>は全く異なります。彼らはカー駐車場に類似しています。

私は常にList<Thing>を返し、必要ならばシングルトンリストにThingを1つだけラップすることを提案します。

ここに1つ(簡単な)方法です。 clazzList<Thing>ためTypeReferenceある

public void read() { 
    objectMapper.readValue("[" + json.replaceAll("^\\[|]$", "") + "]", clazz); 
} 

文字列操作は、JSONは何も存在しない場合は、角括弧を包む追加、"[...]"にラップされます保証します。

関連する問題