ジェネリックとリストをインターフェイスで使用する際に問題があります。ジェネリックを使用してリスト内のオブジェクトをキャストする
私はCommentNewsクラスによって拡張されたインタフェースCommentを持っています。
コメント:
public interface Comment {
public static final String COMMENT_NEWS_PATH = "/comment/news";
public static final String COMMENT_EVENT_PATH = "/comment/event";
public static final String COMMENT_GROUP_PATH = "/comment/group";
public User getUser();
public void setUser(User user);
public String getText();
public void setText(String text);
public Date getModified();
public void setModified(Date modified);
public void setCommentsList(List<?> commentsList);
public <T extends Comment> List<T> getCommentsList();
}
CommentNews:
public class CommentNews implements Comment {
private Integer id;
private User user;
private News news;
private String text;
private List<CommentNews> commentsList;
public CommentNews() {}
// Methods snipped for brevity
public List<CommentNews> getCommentsList() {
return commentsList;
}
public void setCommentsList(List<?> commentsList) {
this.commentsList = (List<CommentNews>) commentsList;
}
}
問題がsetCommentsList方法である、クラスキャストは、実際には、リスト内の各オブジェクトをキャストしません。私はインターフェイスと名前の衝突を生成するので、メソッドのシグネチャを変更することはできません。
ジェネリックを使用してキャスティングを行う方法はありますか?私はリストを反復することを控え、各オブジェクトを手動でキャストしたいと思います。
UPDATE: 私はコメントインタフェースを変更した場合、私は
public void setCommentsList(List<CommentNews> commentsList) {
this.commentsList = commentsList;
}
へ
public <T extends Comment>void setCommentsList(List<T> commentsList);
とCommentNewsクラスにインターフェースを変更する場合は、タイプセーフでなければなりませんが、これは、その結果インタフェースとクラスの間の名前の衝突。
すべてのオブジェクトのキャストは何をしますか?キャストはオブジェクトに対して何も変更しません。キャストを行うことによって発生する可能性があるのは、ClassCastExceptionです。 –