gpt4 book ai didi

java - 使用泛型在列表中转换对象

转载 作者:行者123 更新时间:2023-12-02 00:28:45 25 4
gpt4 key购买 nike

我在使用泛型和列表与接口(interface)时遇到问题。

我有一个 Comment 接口(interface),它由 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 方法,类转换实际上并未转换列表中的每个对象。我无法更改方法签名,因为这会产生与接口(interface)的名称冲突。

有没有办法使用泛型进行转换?我想避免迭代列表并手动转换每个对象。

更新:如果我将 Comment 界面更改为 如果我将界面更改为

public <T extends Comment>void setCommentsList(List<T> commentsList);

和 CommentNews 类

public void setCommentsList(List<CommentNews> commentsList) {
this.commentsList = commentsList;
}

它应该是类型安全的,但这会导致接口(interface)和类之间的名称冲突。

最佳答案

从根本上来说,您的界面不是类型安全的。没有什么可以阻止某人做这样的事情:

Comment comment = ...; // Wherever
List<Integer> numbers = new List<Integer>();
numbers.add(10);
comment.setCommentsList(numbers);

真的愿意允许这样做吗?

可以有一个列表包装器,每当访问它时(而不是预先)执行强制转换,但最好更改接口(interface)。

编辑:如果您希望任何类型的评论仅包含同类子评论,您可能希望使您的 Comment 界面通用,如下所示:

public interface Comment<T extends Comment<T>> {

// Note: no public modifier; it's allowed by the spec but discouraged
void setCommentList(List<T> comments);
List<T> getCommentList();
}

(如果您愿意,您仍然可以使用通配符,但您很可能不需要这样做,这会使事情变得复杂。)

关于java - 使用泛型在列表中转换对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9554783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com