我今天的目标非常简单,我正在努力找到为我的类实现compareTo(或Comparable)接口的正确方法,该接口扩展了DefaultMutableTreeNode。
问题是这个:假设我有一个代表时间的完美的课程。我已经编写了一个非常好的compareTo方法(按照我的意愿工作),我已经使用Arrays.sort()测试了非常好的结果。
现在假设我有一个包含不同对象的JTree,如下所示:
new SpecialNode("Zomg a string!"); // add this group of nodes right here
new SpecialNode(new Time("8:55 PM"));
new SpecialNode(new SomeTypeYouveNeverHeardOf());
因此,作为一名专业程序员,我立即开始编码而没有任何预先考虑。这是我的SpecialNode类:
class SpecialNode extends DefaultMutableTreeNode implements Comparator<SpecialNode>
{
public int compareTo(SpecialNode sn)
{
// Not only does this not work correctly (read: at all)
// But, it is sub-par, how do I get the type information out of the userObject
// So I can cast it correctly and call the correct compareTo method!!
return this.getUserObject().toString().compareTo(sn.getUserObject().toString());
}
}
好的,所以如果你没有阅读评论(哪些,承认,你没有);我的问题是在SpecialNode的compareTo方法中,我只能访问userObject。遗憾的是,我不知道userObject曾经是什么,因此,我无法正确地将其转换为调用正确的compareTo方法!
这真的很痛苦,因为我已经在所有将添加到我的树中的类中编写了几个非常好的compareTo方法。那么有人可以帮助一个人并给我一个提示吗?
tl; dr - 如何从DefaultMutableTreeNode存储的通用对象中获取类型信息?如果那是不可能的,当我甚至不知道它们可能包含什么时,我该如何比较两个SpecialNode实例呢?
提前致谢。
答案 0 :(得分:1)
我假设您不能为每种类型的数据提供TreeNode。如果类型不同,在您的用例中进行比较是否有意义?
思路:
SimpleNode可以知道所有可能的类型,并为可比较的实例和强制转换为正确的类型吗?这是我几年前处理它的方式。
您对未经检查的警告有何看法?在使用JList之前我遇到了类似的问题并且无法让编译器满意(我放弃了swing默认模型以使我的生活变得更轻松)。也许其他人可以改进这个答案?
class SpecialNode<T extends Comparable<T>> extends DefaultMutableTreeNode
implements Comparable<SpecialNode>
{
T typedUserObject;
SpecialNode(T t)
{
this.typedUserObject = t;
setUserObject(t);
}
public int compareTo(SpecialNode node)
{
if(typedUserObject.getClass().isInstance(node.typedUserObject))
{
T otherObj = (T) node.typedUserObject;
return typedUserObject.compareTo(otherObj);
}
else
{
//What are you going to do if they're not the same type?
return -1;
}
}
}
编辑:如果您知道它们应该是相同类型 - 请删除检查
class SpecialNode<T extends Comparable<T>> extends DefaultMutableTreeNode
implements Comparable<SpecialNode<T>>
{
T typedUserObject;
SpecialNode(T t)
{
this.typedUserObject = t;
setUserObject(t);
}
public int compareTo(SpecialNode<T> node)
{
return typedUserObject.compareTo(node.typedUserObject);
}
}
如果你不想要节点本身的代码(我认为不会这样),你可以创建一个单独的类implements Comparator<SpecialNode<T>>