我得到了抽象类
ContentClass
public abstract class ContentClass
{
public abstract String getClassType();
public abstract String getSortId();
}
以及非抽象类
Node
public class Node <ContentClass>
{
private ContentClass content;
private Node left;
private Node right;
public Node(Node l, Node r,ContentClass c)
{
content = c;
left = l;
right = r;
}
public String getNodeSortId(){
return content.getSortId();
}
public String getNodeType(){
return content.getClassType();
}
public ContentClass getContent(){
return content;
}
public Node getLeft(){
return left;
}
public Node getRight(){
return right;
}
}
当前的问题是
content.getSortId()
和 content.getNodeType()
都被标记为“未声明的方法”。
我该如何解决这个问题以及我做错了什么?
我想稍后创建可以包含不同类型内容的非抽象内容类,并且类 Node 应该能够接受任何内容类作为变量
问题是由于您定义通用类 Node 的方式造成的。您已将 Node 定义为采用类型参数 ContentClass,但看起来您试图将它视为 ContentClass 是一个类,而不是类型参数。在您当前的代码中,ContentClass 被视为泛型类型的占位符,而不是对 ContentClass 抽象类的引用。
删除
<ContentClass>
来自
public class Node <ContentClass>
{
private ContentClass content;
private Node left;
这将解决你的问题。
您误解了如何为类声明泛型类型。
public class Node <ContentClass>
不使用名为 ContentClass 的抽象类。该行实际上声明了一个全新的通用类型标识符,您碰巧将其命名为 ContentClass
。它与名为 ContentClass 的抽象类没有任何关系。
如果您查看List或Comparable,您会发现它们使用单个大写字母声明其通用参数类型:
List<E>
、Comparable<T>
。几乎所有 Java SE 类都使用此约定,并且有充分的理由:它大大降低了犯刚才所犯错误的可能性。
您可能想要的是这样的:
public class Node<C extends ContentClass>
{
private C content;
private Node left;
private Node right;
public Node(Node l, Node r, C c)
{
content = c;
left = l;
right = r;
}
// ...
public C getContent() {
return content;
}
在上面的代码中,
C
是类型参数。因为它被声明为必须从 ContentClass 继承的类型,所以类型 C 的任何对象都保证具有 getClassType() 和 getSortId() 方法。
除了
C
的声明之外,命名的 ContentClass 不应出现在 Node 类中的任何位置。