【发布时间】:2012-03-04 12:16:30
【问题描述】:
我在使用泛型和带有接口的列表时遇到问题。
我有一个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();
}
评论新闻:
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 方法,类转换实际上并没有转换列表中的每个对象。我无法更改方法签名,因为这会与接口产生名称冲突。
有没有办法使用泛型进行强制转换?我想避免遍历列表并手动转换每个对象。
更新: 如果我将评论界面更改为如果我将界面更改为
public <T extends Comment>void setCommentsList(List<T> commentsList);
和 CommentNews 类
public void setCommentsList(List<CommentNews> commentsList) {
this.commentsList = commentsList;
}
它应该是类型安全的,但这会导致接口和类之间的名称冲突。
【问题讨论】:
-
每个对象的演员表会做什么?演员表不会改变任何对象。进行强制转换唯一可能发生的事情是 ClassCastException。
标签: java list generics interface casting