- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下类(class):
class TreeItem<T extends TreeItem<?>>{
private final ObservableList<T> childs;
private T parent;
public void addChild(T unit){
childs.add(unit);
unit.setParent(this);
}
public <T> void setParent(T parent){
this.parent = parent;
}
}
我在 setParent 上收到此消息:
Incompatible types.
Required: T
Found: T
我该如何解决这个问题?
最佳答案
重写这个:
public <T> void setParent(T parent){
this.parent = parent;
}
有了这个:
public void setParent(T parent){
this.parent = parent;
}
此外,我建议删除类名声明中的通配符,因为代码无法编译。
所以替换这个:
class TreeItem<T extends TreeItem<?>>
有了这个:
class TreeItem<T extends TreeItem>
你的类中有一个 final 变量。所以它应该在构造函数或内联中初始化。只要您使用泛型变量并且在实例化新对象时解析泛型类型,正确的方法是在构造函数中初始化它,如下所示:
public TreeItem(ObservableList<T> childs) {
this.childs = childs;
}
完成上述建议的更改后,您可能会注意到编译器会警告您消息:Unchecked call to 'setParent(T)'
。这意味着编译器不保证代码在运行时是安全的,并且可能发生堆污染。我将用一个例子来说明。以下代码在运行时以 ClassCastException
结束,因为我们将 parent
变量设置为不是 T
的类型(这可能是由于 键入删除)。
class ChildTreeItem<T extends TreeItem> extends TreeItem<T> {
public ChildTreeItem(ObservableList childs) {
super(childs);
}
}
public class TreeItem<T extends TreeItem>{
private final ObservableList<T> childs;
private T parent;
public TreeItem(ObservableList<T> childs) {
this.childs = childs;
}
public void addChild(T unit){
childs.add(unit);
unit.setParent(this);
}
public void setParent(T parent){
this.parent = parent;
}
public T getParent() {
return parent;
}
public static void main(String[] args) {
ChildTreeItem<ChildTreeItem> treeItem =
new ChildTreeItem<>(new ObservableSequentialListWrapper<>(new ArrayList<>()));
TreeItem<ChildTreeItem> parentItem =
new TreeItem<>(new ObservableSequentialListWrapper<>(new ArrayList<>()));
parentItem.addChild(treeItem);
List<ChildTreeItem> itemList = new ArrayList<>();
itemList.add(treeItem.getParent()); //<------------------- Heap pollution
ChildTreeItem childTreeItem = itemList.get(0); //<-------- ClassCastException
}
}
此问题的可能解决方案是不参数化变量 parent
而是使其成为 TreeItem
类型:
public class TreeItem<T extends TreeItem>{
private final ObservableList<T> childs;
private TreeItem parent;
public TreeItem(ObservableList<T> childs) {
this.childs = childs;
}
public void addChild(T unit){
childs.add(unit);
unit.setParent(this);
}
public void setParent(TreeItem parent){
this.parent = parent;
}
public TreeItem getParent() {
return parent;
}
}
希望这对您有所帮助。
关于java - 来自 TreeItem 的通配符和泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44457944/
我正在使用 GWT ,我有树 Widget.TreeItems 在运行时添加。示例: 1.A 2.B 当我点击A时看起来像 1.A 1.ab 2.cd
我关注这个example to create a simple test with a Table where the foreground color was changed 。这按预期工作。 但是
我正在捕获右键单击事件以显示上下文菜单。我一直无法弄清楚的是,如何在显示上下文菜单之前右键单击实际选择 TreeItem。 感谢所有帮助。 private Tree tree = new Tree(
我目前正在使用 JavaFx-2 的 TreeView代表一个文件系统。 我想启用 drag and drop允许移动操作,但它看起来像 TreeItem不包括拖动事件监听器。我只能在 englobi
我想实现一棵树,里面有可检查的根节点和一些参数(实际上,本例中的参数并不重要)。因此,我制作一棵树,然后放置两列,然后放置一个 TreeItem。然后我需要放置一个带有复选框按钮的 TreeEdito
我有一个 TreeItem(一棵包含 100 多个 TreeItems 元素的树)。我想让用户能够隐藏(或再次显示)一些 TreeItems。 (因此用户只会看到他关心的项目)。 我看不到 TreeI
我正在 JavaFX 中使用 TreeView ,我想知道如何区分类型的节点,我的意思是,我有下一个结构: 1.-Agent 1.1-Use Case Diagram 1.1.1-U
我正在使用 TreeTableView (JavaFX 8)。有一些树节点,必须禁用才能选择。我已经尝试过选择事件,但它不起作用。请找到以下代码以获取更多信息。 treeTableView.getSe
我正在开发 Eclipse 插件。在这里我创建了一个单独的 View ,现在我想格式化树节点的颜色。 这些是 createpartcontrol 方法中的代码。 ScrolledComposite s
我有一个TreeViewer,其中当用户选择一个TreeItem并单击“展开”按钮时,应打开TreeItem下的整个层次结构,直到最后一个叶子找到节点。 我在 TreeViewer 上找到了一个现有方
我有一个 JFace TreeViewer,其中用户可以选择一个 TreeItem 并通过菜单选项检查是否是叶节点。 如何实现这一目标? 最佳答案 您可以通过以下方式从树查看器中获取当前选定的对象:
我正在尝试将包含文件路径的工具提示附加到 TreeItem ,这样当我将鼠标悬停在此 TreeItem 周围时,当我将鼠标悬停在其周围时,它将显示文件路径的文本。这在我的代码中不起作用,因为它提示我无
我有以下类(class): class TreeItem>{ private final ObservableList childs; private T parent; pu
我正在尝试创建一种方法来实现标题所说的功能。假设我有下面的 TreeView ,我想添加一个搜索功能,用户可以在其中给出例如一个值 desktop 并使用该方法获取具有给定值的第一个 TreeItem
有TreeView,每个元素都实现了Viewable接口(interface): public interface Viewable { enum ViewStyle { NE
在我的应用程序中,我有一个由树项组成的树结构。 我想做的是改变某些树元素的背景,如果他们的 userObject 满足某些条件。我遇到的问题是,当根树元素的背景发生变化时(仅根据根级别的树元素满足的标
我制作了这个 TreeView : TreeItem root = new TreeItem<>("roothidden"); treeView.setRoot(root);
编辑 #2:由于它看起来像一个错误,我已经在 javaFx-jira 中发布了错误报告.您必须拥有一个帐户才能访问该问题。如果有新信息,我会及时更新这篇文章。 原帖:我有一个带有按钮和 TreeVie
我有一个 TreeItem目的。 我想在里面放一个按钮。 Button button = new Button("Hello!"); root.setGraphic(button); // root
使用标准 GWT 2.0.3 API,如何向 TreeItem 添加 Clickhandler?我希望实现对服务器的异步调用,以检索展开的结果 TreeItem。 不幸的是FastTree在 GXT
我是一名优秀的程序员,十分优秀!