在Java中,如何使子类的实例变量具有子类的类型,而不是超类的类型?

在Java中,如何使子类的实例变量具有子类的类型,而不是超类的类型?,java,class,inheritance,Java,Class,Inheritance,我正在为从BinaryNode类继承的Java项目编写一个HuffmanTree类。我想使用HuffmanTree节点,而不是BinaryNode节点。BinaryNode具有BinaryNode类型的左、右实例变量,我希望HuffmanTree具有相同的实例变量(即左、右),但类型为HuffmanTree 我该怎么做呢?谢谢 编辑:以下是一些BinaryNode代码: public class BinaryNode<T> implements BinaryNodeInterface

我正在为从BinaryNode类继承的Java项目编写一个HuffmanTree类。我想使用HuffmanTree节点,而不是BinaryNode节点。BinaryNode具有BinaryNode类型的左、右实例变量,我希望HuffmanTree具有相同的实例变量(即左、右),但类型为HuffmanTree

我该怎么做呢?谢谢

编辑:以下是一些BinaryNode代码:

public class BinaryNode<T> implements BinaryNodeInterface<T>, 
                               java.io.Serializable
{
//The BinaryNode's instance variables were changed to protected so we can access them
//from the HuffmanTree class.
private T data;
private BinaryNode<T> left;
private BinaryNode<T> right;

public BinaryNode()
{
    this(null); // call next constructor
} // end default constructor

public BinaryNode(T dataPortion)
{
    this(dataPortion, null, null); // call next constructor
} // end constructor

public BinaryNode(T dataPortion, BinaryNode<T> leftChild,
                               BinaryNode<T> rightChild)
{
    data = dataPortion;
    left = leftChild;
    right = rightChild;
} // end constructor
公共类BinaryNode实现BinaryNodeInterface,
java.io.Serializable
{
//BinaryNode的实例变量已更改为受保护,以便我们可以访问它们
//从赫夫曼特里班。
私有T数据;
私有二进制节点左;
私有二进制节点权限;
公共二进制节点()
{
this(null);//调用下一个构造函数
}//结束默认构造函数
公共二进制节点(T数据部分)
{
this(datapartion,null,null);//调用下一个构造函数
}//结束构造函数
公共BinaryNode(T数据部分,BinaryNode leftChild,
二进制节点(右子节点)
{
数据=数据部分;
left=leftChild;
右=右子女;
}//结束构造函数

根据类和接口的名称猜测,第一步是将left和right的声明更改为

protected BinaryNodeInterface<T> left;
protected BinaryNodeInterface<T> right;
您的
HuffmanTree
构造函数可以是

public BinaryNode(T dataPortion, BinaryNode<T> leftChild,
                           BinaryNode<T> rightChild)
{
    data = dataPortion;
    left = leftChild;
    right = rightChild;
} // end constructor
public HuffmanTree(T dataPortion, HuffmanTree<T> leftChild,
                           HuffmanTree<T> rightChild)
{
    data = dataPortion;
    left = leftChild;
    right = rightChild;
} // end constructor
如果没有代码重复的话,这可能也会起作用

请注意,一旦执行此操作,任何假定
left
right
BinaryNode
实例的现有代码都必须更新。最好的做法是将代码更改为仅依赖
BinaryNodeInterface
,但这并不总是可能的


BinaryNode
方法中,简单地强制转换应该是安全的(取决于方法的约定):
BinaryNode节点=(BinaryNode)left;
。在
HuffmanTree
方法中,调用
HuffmanTree节点=(HuffmanTree)可能不安全左
,因为左可能是一个
二进制节点
,而不是
HuffmanTree
。在这些情况下,您必须自己计算逻辑。

可能是通过泛型。二进制节点代码看起来像什么?请共享一些代码。泛型可能不起作用:好的,我添加了一些代码。更改声明使用BinaryNoteInterface进行左右保护和声明的操作给了我一系列错误,说我无法将BinaryNodeInterface转换为BinaryNode。如果我这样做,它会破坏我几乎所有的其他方法。编辑:没关系,我已经修复了它。谢谢!当然是强制转换。这很痛苦,但它现在正在工作。更新了相应地拒绝
public BinaryNode(T dataPortion, BinaryNodeInterface<T> leftChild,
                           BinaryNodeInterface<T> rightChild)
{
    data = dataPortion;
    left = leftChild;
    right = rightChild;
} // end constructor