我正在使用Java 6。
我无法让内部类使用与其包含的类相同的泛型类。目前我有
public class TernarySearchTree < T > {
...
protected class TSTNode < T > {
// index values for accessing relatives array
protected static final int PARENT = 0, LOKID = 1, EQKID = 2, HIKID = 3;
protected char splitchar;
protected TSTNode < T > [] relatives;
private T data;
protected TSTNode(char splitchar, TSTNode < T > parent) {
this.splitchar = splitchar;
relatives = new TSTNode[4];
relatives[PARENT] = parent;
}
}
}
现在我得到警告
类型参数T隐藏了类型T
如果我从内部类中删除类型参数(即<T>
从protected class TSTNode<T>
行中删除),则会在该行上出现编译错误relatives = new TSTNode[4]
。
我怎样才能使一切正确?
您可以:
<T>
从TSTNode
(即,使其成为非泛型的)中移除类型参数-仍然可以访问external <T>
。
将<T>
class中的type参数重命名TSTNode
为(say)U
。
[更新]
下面是四种重写代码的方法。它们全部编译。我认为您应该考虑使用的用法EnumMap
(请参见下面的版本4)。
版本1 :在内部类中使用不同名称的type参数。您需要使用列表而不是数组。
public class TernarySearchTree<T> {
protected class TSTNode<U> {
// index values for accessing relatives array:
protected static final int PARENT = 0, LOKID = 1, EQKID = 2, HIKID = 3;
protected char splitchar;
protected List<TSTNode<U>> relatives;
private U data;
protected TSTNode(char splitchar, TSTNode<U> parent) {
this.splitchar = splitchar;
relatives = new ArrayList<TSTNode<U>>();
for (int i = 0; i < HIKID; ++i) { // Allocate 4 slots in relatives
relatives.add(null);
}
relatives.set(PARENT, parent);
}
}
private TSTNode<T> node; // When you use it, pass T as U
public TernarySearchTree() {
node = new TSTNode<T>(',', null); // When you use it, pass T as U
}
}
版本2 :从封闭类继承T
public class TernarySearchTree<T> {
protected class TSTNode {
// index values for accessing relatives array:
protected static final int PARENT = 0, LOKID = 1, EQKID = 2, HIKID = 3;
protected char splitchar;
protected List<TSTNode> relatives;
private T data;
protected TSTNode(char splitchar, TSTNode parent) {
this.splitchar = splitchar;
relatives = new ArrayList<TSTNode>();
for (int i = 0; i < HIKID; ++i) { // Allocate 4 slots in relatives
relatives.add(null);
}
relatives.set(PARENT, parent);
}
}
private TSTNode node;
public TernarySearchTree() {
node = new TSTNode(',', null);
}
}
版本3 :使用地图(而不是列表)
public class TernarySearchTree<T> {
protected class TSTNode {
// index values for accessing relatives array:
protected static final int PARENT = 0, LOKID = 1, EQKID = 2, HIKID = 3;
protected char splitchar;
protected Map<Integer, TSTNode> relatives;
private T data;
protected TSTNode(char splitchar, TSTNode parent) {
this.splitchar = splitchar;
// Create a hash map. No need to pre-allocate!
relatives = new HashMap<Integer, TSTNode>();
relatives.put(PARENT, parent); // set -> put
}
}
private TSTNode node;
public TernarySearchTree() {
node = new TSTNode(',', null);
}
}
}
版本4 :将索引定义为枚举+使用EnunMap(而不是哈希图)
public class TernarySearchTree<T> {
protected static enum Index {
PARENT, LOKID, EQKID, HIKID;
}
protected class TSTNode {
protected char splitchar;
protected EnumMap<Index, TSTNode> relatives;
private T data;
protected TSTNode(char splitchar, TSTNode parent) {
this.splitchar = splitchar;
// Create an EnumMap.
relatives = new EnumMap<Index, TSTNode>(Index.class);
relatives.put(Index.PARENT, parent);
}
}
private TSTNode node;
public TernarySearchTree() {
node = new TSTNode(',', null);
}
}
[更新2] 要记住的一件事:使用EnumMap代替顺序索引
我知道如果我想扩展内部类,我应该这样做: 但是在这种情况下,我不明白该怎么办?如何获取内部对象的封闭实例? 此变体不编译:
下面是我发现的关于内部类的两个语句 JavaDocs: 与实例方法和变量一样,内部类与其封闭类的实例相关联,并可以直接访问该对象的方法和字段。此外,因为内部类与实例相关联,所以它本身不能定义任何静态成员。 在另一个网站上,我发现了这个: 在大多数情况下,嵌套类就是在封闭类的定义中声明的类。它不会从封闭类继承任何东西,嵌套类的实例不能分配给封闭类的变量引用。 粗体标记的线条不矛盾吗?如何才能不继承周
问题内容: 我正在扩展ArrayList来创建一个自定义ArrayList,可以在迭代它的同时使用常规ArrayList方法进行修改。为此,我还要创建一个迭代器。 在我的hasNext()和next()方法期间,我需要确保列表没有被修改(可以在任何其他时间修改)。因此,我需要在我的shared()块中引用我的封闭类型。 问题答案: 。因此,在您的情况下,它将为。
我有一个类“C”,它有一个内部类“Ci”。“C”类继承了“S”类。“S”类也有一个内部类“Si”。“Ci”能继承“Si”吗?非常感谢任何回应的人。 这样的事情可能吗?
我尝试了下面的代码,根据它,我理解内部类继承到OuterClass的子类。是正确的吗? 输出除外: 2. 奥特你好。内部的 当这行代码运行时,它应该意味着内部类被继承给了ChildClass 我很困惑,因为我在链接上发现了下面的语句 当外部类由其子类扩展时,成员内部类将不会继承到子类。若要在外部类的子类内使用内部类属性,子类还必须具有内部类,并且该内部类必须扩展外部类的内部类。
我正在阅读关于从内部类继承的内容,我一直在努力理解下面的代码是如何工作的: 据我所知,关键字Super指的是超类,Super()指的是它没有参数构造函数。在外层类的情况下,超类是Object类。 我想了解一下,这段代码是如何工作的。 为什么Object类的实例化使扩展内部类成为可能? 创建Object类实例与创建外层类对象有什么关系? 删除包含"o.super();"的行会导致错误: java:包