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