如果ElementType是静态已知的类型,则很容易创建表示Type集合的ElementType对象:

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


但这在这里是不可能的,因为我的elementType是一个动态值,仅在运行时才知道:

@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);
}


现在,我希望listType表示ObservableList<>,其类型参数应为elementType的值。有办法吗?

最佳答案

如果您有番石榴,则可以使用其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);
}

09-04 12:00
查看更多