2016-05-11 11 views
1

から取得ParametrizedType対象:<code>ElementType</code>が静的​​に既知のタイプであれば、それは<code>ElementType</code>のコレクションを表す<code>Type</code>オブジェクトを作成するには、「簡単」である動的な要素型

Type listType = new TypeToken<ObservableList<ElementType>>(){}.getType(); 

しかし、これは私として、ここではできませんelementTypeは、実行時にのみ知られている動的な値である:012の値であるべきである

@Override 
public ListProperty<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws 
     JsonParseException { 
    Type elementType = ((ParameterizedType) typeOfT).getActualTypeArguments()[0]; 
    Type listType = // ??? create the type representing a ObservableList<elementType> 
    ObservableList<?> list = context.deserialize(json, listType); 
    return new SimpleListProperty<>(list); 
} 

今はObservableList<>型パラメータを表すためにlistTypeを希望します。そうする方法はありますか?

+0

私は共同です'elementType'が何を指しているのかについてnfused? _dynamic_はどういう意味ですか?それはどこから来ていますか? –

+0

@SotiriosDelimanolis私はいくつかの並べ替えのためのカスタムJSONデシリアライザを書いています。そのリストの型は、私のメソッドに 'Type typeOfT'パラメータとして与えられます。今私のデシリアライザは、別の種類のリストとしてデシリアライズすることで作業を延期することになっています。そのため、私は自分自身のために 'typeOfT'を作成する必要があります。 – Joffrey

+0

[こちら](http://stackoverflow.com/a/25223817/438154)を参照してください。 –

答えて

0

this postで示唆したように、私はParametrizedTypeの私の独自の実装を作成することになった:

private static class CustomParameterizedType implements ParameterizedType { 

    private Type rawType; 
    private Type ownerType; 
    private Type[] typeArguments; 

    private CustomParameterizedType(Type rawType, Type ownerType, Type... typeArguments) { 
     this.rawType = rawType; 
     this.ownerType = ownerType; 
     this.typeArguments = typeArguments; 
    } 

    @Override 
    public Type[] getActualTypeArguments() { 
     return typeArguments; 
    } 

    @Override 
    public Type getRawType() { 
     return rawType; 
    } 

    @Override 
    public Type getOwnerType() { 
     return ownerType; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) { 
      return true; 
     } 
     if (o == null || getClass() != o.getClass()) { 
      return false; 
     } 
     CustomParameterizedType that = (CustomParameterizedType) o; 
     return Objects.equals(rawType, that.rawType) && 
       Objects.equals(ownerType, that.ownerType) && 
       Arrays.equals(typeArguments, that.typeArguments); 
    } 

    @Override 
    public int hashCode() { 
     return Objects.hash(rawType, ownerType, typeArguments); 
    } 
} 

そして、私はそれをこの方法を使用することができます。

@Override 
public ListProperty<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws 
     JsonParseException { 
    Type elementType = ((ParameterizedType) typeOfT).getActualTypeArguments()[0]; 
    Type listType = new CustomParametrizedType(ObservableList.class, null, elementType); 
    ObservableList<?> list = context.deserialize(json, listType); 
    return new SimpleListProperty<>(list); 
} 
1

あなたはグアバを持っている場合は、あなたが使用することができますあなたの必要とするものを提供するTypeTokenのバージョン:

static <T> TypeToken<ObservableList<T>> mapToken(TypeToken<T> typeParameter) { 
    return new TypeToken<ObservableList<T>>() {}.where(new TypeParameter<T>() {}, typeParameter); 
} 

@Override 
public ListProperty<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws 
     JsonParseException { 
    Type elementType = ((ParameterizedType) typeOfT).getActualTypeArguments()[0]; 
    Type listType = mapToken(TypeToken.of(elementType)).getType(); 
    ObservableList<?> list = context.deserialize(json, listType); 
    return new SimpleListProperty<>(list); 
} 
+0

答えをありがとうが、私はむしろこれを使用していないので、Guavaに依存関係を追加したくない。 – Joffrey

関連する問題

 関連する問題