java – 如何获得一个内部类继承包围类的通用类型?
发布时间:2020-12-14 05:18:21 所属栏目:Java 来源:网络整理
导读:我正在使用 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 =
我正在使用
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; } } } 现在我得到警告
如果我从内部类中删除类型参数(即从受保护的类TSTNode< T>行中删除< T>),则在relatives = new TSTNode [4]行上得到一个编译错误. 如何使一切正确? 解决方法
你可以:
>删除< T>来自TSTNode的类型参数(即使其成为非泛型) – 它仍然可以访问外部< T>. [UPDATE] 以下是重写代码的四种不同的方法.他们都编译我想你应该考虑使用EnumMap(见下面的第4版). 版本1:在内部类中使用不同命名的类型参数.您需要使用List而不是数组. public class TernarySearchTree<T> { protected class TSTNode<U> { // index values for accessing relatives array: protected static final int PARENT = 0,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,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,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 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] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |