Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在这种情况下可以使用继承吗?(爪哇)_Java_Inheritance_Subclass_Superclass - Fatal编程技术网

Java 在这种情况下可以使用继承吗?(爪哇)

Java 在这种情况下可以使用继承吗?(爪哇),java,inheritance,subclass,superclass,Java,Inheritance,Subclass,Superclass,我有ClassA和ClassB,ClassA是超类 ClassA使用NodeA,ClassB使用NodeB 第一个问题:方法参数。ClassB需要NodeB类型,但我不能从子类转换为超类。这意味着我不能设置NodeB独有的属性 第二个问题:当我需要向ClassB添加节点时,我必须实例化一个新的NodeB。但是,我不能在超类中这样做,所以我必须重写插入以使用NodeB 有没有办法解决这个问题,或者我必须重写整个过程?我认为,解决您的难题的最佳方法是使用泛型:将公共代码放在一个(可能是抽象的)公共超

我有ClassA和ClassB,ClassA是超类

ClassA使用NodeA,ClassB使用NodeB

第一个问题:方法参数。ClassB需要NodeB类型,但我不能从子类转换为超类。这意味着我不能设置NodeB独有的属性

第二个问题:当我需要向ClassB添加节点时,我必须实例化一个新的NodeB。但是,我不能在超类中这样做,所以我必须重写插入以使用NodeB


有没有办法解决这个问题,或者我必须重写整个过程?

我认为,解决您的难题的最佳方法是使用泛型:将公共代码放在一个(可能是抽象的)公共超类中,该超类由节点类型参数化,例如,
NodeType
。A和B中的每一个都可以分别对
CommonSuper
CommonSuper
进行子类化,并在需要时覆盖它们各自的节点类型。这样,您的代码中几乎没有重复,但能够完成所有需要的工作。

也许您正在寻找类似的东西

class NodeA { ... }
class NodeB extends NodeA { ... }

class ClassA<N extends NodeA> {
    public Node newNode() { return new NodeA(); }
    public void setProperties(Node n) { setPropertiesA(n); }
}

class ClassB extends ClassA<NodeB> {
    @Override
    public NodeB newNode() { return new NodeB(); }
    @Override
    public void setProperties(NodeB n) { setPropertiesB(n); super.setProperties(n); }
}
类节点{…}
类NodeB扩展了NodeA{…}
甲级{
公共节点newNode(){返回新节点a();}
公共void setProperties(节点n){setPropertiesA(n);}
}
类B扩展了类A{
@凌驾
公共节点B newNode(){返回新节点B();}
@凌驾
public void setProperties(NodeB n){setpropertieb(n);super.setProperties(n);}
}
这大概就是你想要的吗


特别是,请注意ClassB如何覆盖addNode以返回子类,并且setProperties被“链接”以在适当的时候设置NodeB的属性。

NodeA是NodeB的超类吗?您是说并行层次结构吗?你能更具体一点吗?是的,这是一个平行的层次结构,是的,NodeA是nodeb的超类。注意所有的“使用泛型”答案。。。泛型在Java中很好,只要您不需要:扩展可处理,可处理。卡布姆!不起作用[TM]。因此,Java泛型无论如何都不是一把金锤,您必须意识到它们的局限性。