【问题标题】:Comparing a generic return type to a similar generic variable in Java将泛型返回类型与 Java 中的类似泛型变量进行比较
【发布时间】:2013-03-28 16:46:51
【问题描述】:

我正在用 Java 编写一个通用链表,除了一个问题外,一切正常。

列表节点保存一个类型为 E 的变量“数据”,而我在通用链表代码中也有一个类型为 E 的变量“tempData”。数据类型 E 将由程序使用链表确定。

我要做的是通过调用节点函数 getData() 从链接节点“数据”中检索变量并将其存储在一个名为 tempData 的变量中。

这是当前代码:

tempData = firstNode.getData();

我的问题是,在编译时我收到错误消息,说它们是“不兼容的类型”。我知道在运行时它们将是相同的数据类型,但我如何满足它的编译语法?

我已尝试将代码放入:

if( firstNode.getData() instanceof tempData.getClass() )

但它不起作用,因为类应该是不允许调用方法的。我也尝试了以下方法,但我仍然得到了原来的编译错误。

if( (firstNode.getData()).getClass == tempData.getClass() )

非常感谢任何和所有帮助,谢谢。

编辑 3-28-13

tempData 的声明是“E tempData;”

firstNode 的声明是“私有 ListNode firstNode;”

声明firstNode中的数据是“私有E数据”; .getData();

LinkedList 类“公共类 LinkedList E”的标题

ListNode 类“公共类 ListNode E”的标头

标题中的两个 E 周围都有小于和大于符号,它们只是在发布时不显示。

【问题讨论】:

  • 您能否将 tempData 和 firstNode 的声明添加到您的问题中?会让我更容易看到我怀疑的问题。
  • @Jules E tempData;并在 firstNode(和所有节点)私有 E 数据;由 .getData() 返回
  • firstNode 本身及其 getData() 方法是如何声明的?
  • 而且 firstNode 大概被声明为ListNode<E> firstNode,是吗? (要使代码正确显示,请在其周围使用向后的单引号)。
  • 原来我忘记在ListNode后面加上''了,非常感谢你的帮助

标签: java generics comparison


【解决方案1】:

一个可能的答案是在您的列表中存储一个 Class 对象,如下所示:

Class<E> clazz;

然后在构造函数中用正确的对象初始化 this:

public MyList(Class<E> clazz) {
   this.clazz = clazz;
}

...

new MyList<E>(E.class);

然后您可以使用此类对象将对象转换为正确的类型:clazz.cast(firstNode.getData())

可能有更好的解决方案,但在最坏的情况下,这种方法有效。

【讨论】:

  • 在尝试您的代码时遇到了几个错误,因此我将其更改为: Class c = tempData.getClass();唯一的问题是转换仍然不起作用,因为我收到以下错误 LinkedList.java:115: error: incompatible types tempData = c.cast(firstNode.getData());所以我尝试将两者都转换为相同的类型并得到 LinkedList.java:115: error: unexpected type c.cast(tempData) = c.cast(firstNode.getData()); ^ 我做错了吗?
  • 我对我的意思添加了更多解释。这有帮助吗?
  • 我很想试试你写的,但是因为这是一个提供了UML图的作业,所以我不能更改构造函数的参数
猜你喜欢
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
相关资源
最近更新 更多