为什么我会收到未经检查的分配警告?

时间:2015-08-04 21:10:01

标签: java android json gson classcastexception

使用Gson将JSON字符串转换为Java对象时,我收到此警告。为什么我会得到它,我该如何解决?

这是我在代码中收到的警告:

Unchecked assignment: 
    'net.brawtasports.brawtasportsgps.model.JSONKeys' to 
    'net.brawtasports.brawtasportsgps.model.JSONKeys<net.brawtasports.brawtasportsgps.model.team.Object>'

这是我在运行时得到的错误:

java.lang.ClassCastException:
    com.google.gson.internal.LinkedTreeMap cannot be cast to
    net.brawtasports.brawtasportsgps.model.team.Object

这是我的代码:

  String jsonString = Preferences.readFromPreferences(ApplicationConstants.team_data,"");
    Gson gson = new Gson();
    JSONKeys<Object> teamMembers = gson.fromJson(jsonString, JSONKeys.class); //converts json string to java object
    Object players = teamMembers.getObject();//object is my custom class
    //ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_spinner_dropdown_item,players);
    ArrayAdapter arrayAdapter = new ArrayAdapter(getActivity(),android.R.layout.simple_spinner_dropdown_item,players.getPlayersSummary());
    player1.setAdapter(arrayAdapter);

以下是我的JSONKeys POJO的代码:

   public class JSONKeys<T> {

private boolean Success;
private String Message;
private int ObjectIdentifier;
private T Object;
private java.util.List<List> List = new ArrayList<List>();
private int TotalRecords;
private String ErrorMessage;
private int Code;


private net.brawtasports.brawtasportsgps.model.match.Criteria Criteria;

private net.brawtasports.brawtasportsgps.model.match.SearchInfo SearchInfo;
//Add Object from match class


/**
 * @return The Criteria
 */
public net.brawtasports.brawtasportsgps.model.match.Criteria getCriteria() {
    return Criteria;
}

/**
 * @param Criteria The Criteria
 */
public void setCriteria(net.brawtasports.brawtasportsgps.model.match.Criteria Criteria) {
    this.Criteria = Criteria;
}

/**
 * @return The SearchInfo
 */
public net.brawtasports.brawtasportsgps.model.match.SearchInfo getSearchInfo() {
    return SearchInfo;
}

/**
 * @param SearchInfo The SearchInfo
 */
public void setSearchInfo(net.brawtasports.brawtasportsgps.model.match.SearchInfo SearchInfo) {
    this.SearchInfo = SearchInfo;
}

/**
 * @return The List
 */
public java.util.List<List> getList() {
    return List;
}

/**
 * @param List The List
 */
public void setLArrayListList(java.util.List<List> List) {
    this.List = List;
}


/**
 * @return The Code
 */
public int getCode() {
    return Code;
}

/**
 * @param Code The Code
 */
public void setCode(int Code) {
    this.Code = Code;
}

/**
 * @return The TotalRecords
 */
public int getTotalRecords() {
    return TotalRecords;
}

/**
 * @param TotalRecords The TotalRecords
 */
public void setTotalRecords(int TotalRecords) {
    this.TotalRecords = TotalRecords;
}

/**
 * @return The ErrorMessage
 */
public String getErrorMessage() {
    return ErrorMessage;
}

/**
 * @param ErrorMessage The ErrorMessage
 */
public void setErrorMessage(String ErrorMessage) {
    this.ErrorMessage = ErrorMessage;
}

/**
 *
 * @return
 * The message
 */
public String getMessage() {
    return Message;
}

/**
 *
 * @param message
 * The message
 */
public void setMessage(String message) {
    this.Message = message;
}


/**
 *
 * @return
 * The Success
 */
public boolean isSuccess() {
    return Success;
}

/**
 *
 * @param Success
 * The Success
 */
public void setSuccess(boolean Success) {
    this.Success = Success;


}


/**
 *
 * @return
 * The ObjectIdentifier
 */
public int getObjectIdentifier() {
    return ObjectIdentifier;
}

/**
 *
 * @param ObjectIdentifier
 * The ObjectIdentifier
 */
public void setObjectIdentifier(int ObjectIdentifier) {
    this.ObjectIdentifier = ObjectIdentifier;
}

/**
 *
 * @return
 * The Object
 */
public T getObject() {
    return Object;
}

/**
 *
 * @param Object
 * The Object
 */
public void setObject(T Object) {
    this.Object = Object;
}

}

我的对象POJO是:

   public class Object {

private HomeTeamGoals HomeTeamGoals;
private AwayTeamGoals AwayTeamGoals;
private List<PlayersSummary> PlayersSummary = new ArrayList<PlayersSummary>();
private TeamSummary TeamSummary;

/**
 *
 * @return
 * The HomeTeamGoals
 */
public HomeTeamGoals getHomeTeamGoals() {
    return HomeTeamGoals;
}

/**
 *
 * @param HomeTeamGoals
 * The HomeTeamGoals
 */
public void setHomeTeamGoals(HomeTeamGoals HomeTeamGoals) {
    this.HomeTeamGoals = HomeTeamGoals;
}

/**
 *
 * @return
 * The AwayTeamGoals
 */
public AwayTeamGoals getAwayTeamGoals() {
    return AwayTeamGoals;
}

/**
 *
 * @param AwayTeamGoals
 * The AwayTeamGoals
 */
public void setAwayTeamGoals(AwayTeamGoals AwayTeamGoals) {
    this.AwayTeamGoals = AwayTeamGoals;
}

/**
 *
 * @return
 * The PlayersSummary
 */
public List<PlayersSummary> getPlayersSummary() {
    return PlayersSummary;
}

/**
 *
 * @param PlayersSummary
 * The PlayersSummary
 */
public void setPlayersSummary(List<PlayersSummary> PlayersSummary) {
    this.PlayersSummary = PlayersSummary;
}

/**
 *
 * @return
 * The TeamSummary
 */
public TeamSummary getTeamSummary() {
    return TeamSummary;
}

/**
 *
 * @param TeamSummary
 * The TeamSummary
 */
public void setTeamSummary(TeamSummary TeamSummary) {
    this.TeamSummary = TeamSummary;
}
 }

1 个答案:

答案 0 :(得分:4)

在反序列化泛型时,您需要使用完全指定的类型。他们需要改变的关键线在这里:

JSONKeys<Object> teamMembers = gson.fromJson(jsonString, JSONKeys.class);

由于您正在使用JSONKeys.class,因此Gson不知道JSONKeys的泛型类型是什么。相反,使用这个:

JSONKeys<Object> teamMembers = gson.fromJson(jsonString, 
        new TypeToken<JSONKeys<net.brawtasports.brawtasportsgps.model.team.Object>>(){}.getType());

这将告诉Gson您需要使用哪种通用类型。请参阅我的解释,了解其原因:How does Gson TypeToken work?

顺便说一句,不要将您的课程命名为与java.lang包中的任何内容相同的内容。它会让你的代码真正让人感到困惑,因为当你忘记import语句意外地引用错误的代码时,会导致不可预见的错误。