我在使用泛型和接口列表时遇到了问题。使用泛型在列表中铸造对象
我有一个接口Comment,它由类CommentNews扩展。
评论:
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 <T extends Comment>void setCommentsList(List<T> commentsList);
和CommentNews类更改为
public void setCommentsList(List<CommentNews> commentsList) {
this.commentsList = commentsList;
}
它应该是类型安全的,但是这导致名称在界面和类之间发生冲突。
每个对象都会施放什么?演员阵容不会改变任何对象。通过执行转换可能发生的唯一情况是ClassCastException。 – 2012-03-04 12:19:01