在非抽象类中使用抽象方法

问题描述 投票:0回答:2

我得到了抽象类

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 应该能够接受任何内容类作为变量

java abstract
2个回答
0
投票

问题是由于您定义通用类 Node 的方式造成的。您已将 Node 定义为采用类型参数 ContentClass,但看起来您试图将它视为 ContentClass 是一个类,而不是类型参数。在您当前的代码中,ContentClass 被视为泛型类型的占位符,而不是对 ContentClass 抽象类的引用。

删除

<ContentClass>

来自

public class Node <ContentClass>
    {
        private ContentClass content;
        private Node left;

这将解决你的问题。


0
投票

您误解了如何为类声明泛型类型。

public class Node <ContentClass>
使用名为 ContentClass 的抽象类。该行实际上声明了一个全新的通用类型标识符,您碰巧将其命名为
ContentClass
。它与名为 ContentClass 的抽象类没有任何关系。

如果您查看ListComparable,您会发现它们使用单个大写字母声明其通用参数类型:

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 类中的任何位置。

© www.soinside.com 2019 - 2024. All rights reserved.