错误:不能在类型转换器中使用未绑定的泛型

Abe*_*rad 10 android android-room android-livedata android-architecture-components

我正在使用 Room 来做数据持久化,我想要的是有两种方法

打电话stringToObject(String data)

处理多个类的所有类型转换

这样的:MoviesListReviewListTrailerList

当我运行应用程序时,出现此错误:

错误:无法在类型转换器中使用未绑定的泛型。

public class Converters{
public static Gson gson = new Gson();

@TypeConverter
public static <T> List<T> stringToObject(String data) {
    if (data == null) {
        return Collections.emptyList();
    }

    Type listType = new TypeToken<List<T>>(){}.getType();

    return gson.fromJson(data, listType);
}

@TypeConverter
public static <T>  String ObjectToString(List<T> someObjects) {
      return gson.toJson(someObjects);
    } 
}
Run Code Online (Sandbox Code Playgroud)
public class ReviewList {

@SerializedName("id")
private Integer id;
@SerializedName("page")
private Integer page;
@SerializedName("results")
private List<Review> reviewList = null;
@SerializedName("total_pages")
private Integer totalPages;
@SerializedName("total_results")
private Integer totalResults;

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public Integer getPage() {
    return page;
}

public void setPage(Integer page) {
    this.page = page;
}

public List<Review> getReviewList() {
    return reviewList;
}

public void setReviewList(List<Review> reviewList) {
    this.reviewList = reviewList;
}

....
Run Code Online (Sandbox Code Playgroud)

}


public class TrailerList {

@SerializedName("id")
private Integer id;
@SerializedName("results")
private List<Trailer> trailers = null;

public List<Trailer> getTrailers() {
    return trailers;
}

public void setTrailers(List<Trailer> trailers) {
    this.trailers = trailers;
}

....
Run Code Online (Sandbox Code Playgroud)

什么是诅咒错误?

我该如何解决?

Nob*_*dy8 2

是的!这是可能的!对于其他想要使用generic type converters房间的人,这是我的方法:

public abstract class BaseConverter<T> {

    private final Gson gson;
    private final Type type;

    public BaseConverter(Type type) {
        this.type = type;

        this.gson = new GsonBuilder()
                .serializeNulls()
                .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE)
                .create();
    }

    @TypeConverter
    public List<T> mapStringToList(String value) {
        return gson.fromJson(value, type);
    }

    @TypeConverter
    public String mapListToString(List<T> value) {
        return gson.toJson(value, type);
    }

}
Run Code Online (Sandbox Code Playgroud)

现在您可以创建自己的转换器。例如:

public class UserConverter extends BaseConverter<User> {

    public UserConverter() {
        super(new TypeToken<List<User>>() {}.getType());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将类型转换器添加到房间配置中:

@TypeConverters({
        UserConverter.class
})
public abstract class RoomDB extends RoomDatabase {
        // ...
}
Run Code Online (Sandbox Code Playgroud)