Java不能使用泛型数组 Level Order Traverse Binary Tree

java中关于泛型与数组的疑问? 

为什么代码 List<String>[] sa = new List<String>[10];是错误的?
孤月随枫 | 浏览 1116 次 |举报
我有更好的答案
 
推荐于2017-11-21 22:33:48 最佳答案
 
1
public static void main(String[] args) {

 

    // 不能使用泛型数组

    // Cannot create a generic array of List<String>

    // List<String>[] lists = new List<String>[10];

 

 

    // 但是你可以使用集合数组, 如果你非要这样做的话

    List[] test2 = new List[10];

 

    // 我不确定你这样做的动机是什么, 如果非要使用到泛型集合数组的话, 也可以这样

    // Key: 索引

    // Value: 泛型集合

    // 缺点: 索引需要自己维护

    Map<Integer, List<String>> collectionArray = new LinkedHashMap<Integer,     List<String>>();

}

 
追问
我是想晓得为什么不能这么做 原因是什么
 
追答
这个是Java语言的规范, 这是一个硬性约束.
就好比你看一部电影, 在看的时候你不能改变什么, 如果非要改变什么就只能把它拆分开, 再加入一些你自己的东西, 但这时候已经不是原来的电影了.
也就是说, 如果你有能力的话, 你也可以破坏掉(或者说升级)这个约束.
不过就个人而言, Java有这么多人在使用它, 既然出现这样的约束必定有其原因所在.

再者, Java对程序员而言是应用型语言, 而不是研究性语言.

package com.skex;

import java.util.LinkedList;
import java.util.Queue;

public class BinaryNode<T> {
    public T element;
    public BinaryNode<T> left;
    public BinaryNode<T> right;
    
    public BinaryNode(T ob) {
        this.element = ob;
        this.left=null;
        this.right=null;
    }
    
    public BinaryNode(){
        this.left=null;
        this.right=null;    
    }

    public T getElement() {
        return element;
    }

    public BinaryNode<T> getLeft() {
        return left;
    }

    public void setLeft(BinaryNode<T> left) {
        this.left = left;
    }

    public BinaryNode<T> getRight() {
        return right;
    }

    public void setRight(BinaryNode<T> right) {
        this.right = right;
    } 
    
    public void levelTraverse(BinaryNode<T> root){
        if(root == null)
            return;
        //
        //queue.offer(root);
        //queue.isEmpty()
        //BinaryNode<T> node = queue.poll();
        //
        Queue<BinaryNode<T>> queue = new LinkedList<BinaryNode<T>>();//层序遍历时保存结点的队列
        queue.offer(root);//初始化
        while(!queue.isEmpty()){
            BinaryNode<T> node = queue.poll();
            System.out.print(node.element + " ");//访问节点
            if(node.left != null)
                queue.offer(node.left);
            if(node.right != null)
                queue.offer(node.right);
        }
    }
    
}
package com.skex;

public class LevelOrderBiTree {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //levelTraverse(tree.root);
        /*构建二叉树*/
        //BinaryNode<Integer>[] s_arr=new BinaryNode<Integer>[6];
        BinaryNode<Integer> s_arr0 = new BinaryNode<Integer>(0);
        BinaryNode<Integer> s_arr1 = new BinaryNode<Integer>(1);
        BinaryNode<Integer> s_arr2 = new BinaryNode<Integer>(2);
        BinaryNode<Integer> s_arr3 = new BinaryNode<Integer>(3);
        BinaryNode<Integer> s_arr4 = new BinaryNode<Integer>(4);
        BinaryNode<Integer> s_arr5 = new BinaryNode<Integer>(5);
        s_arr0.left = s_arr1;  //   0
        s_arr0.right = s_arr2; //  1  2
        s_arr1.left = s_arr3;  // 3     5
        s_arr3.left = s_arr4;  //4
        s_arr2.right = s_arr5; //所以层序遍历的结果为:0 1 2 3 5 4
        
        new BinaryNode<Integer>().levelTraverse(s_arr0);
        //0 1 2 3 5 4 
        
    }

}

 

posted @ 2018-02-06 10:49  sky20080101  阅读(134)  评论(0)    收藏  举报