日期:2014-05-20  浏览次数:20730 次

讨论java两个奇怪的语法现象
1.为什么方法里只要有while循环就可以不用返回值,而且必须是while,for循环就不行
Java code

private String abc(){
        while(true){
        }
    }



2.jdk1.5开始增加了范型,为什么数组不支持范型,数组的范型检查警告该如何消除(请别说用@SuppressWarnings("unchecked"))
Java code
 
List[] listArray = new List[]{new ArrayList<String>(), new ArrayList<String>()};
listArray[0].add("0");
listArray[1].add("1");



------解决方案--------------------
for也行,不懂,是不是因为死循环的缘故.
Java code
    public static String abc(){
        for(;true;){
            
        }
    }

------解决方案--------------------
1、首先,試了一下,for是可以的。其次,也不是说有while循环就不用返回值,而是死循环不用返回值,编译器还是比较聪明的。(可以试试看里面放个break)
2、baidu了一下,IBM网站有篇文章,建议楼主去看看。
大概的意思是:


“在这里可以看到一种模式 —— 与泛型有关的很多问题或者折衷并非来自泛型本身,而是保持和已有代码兼容的要求带来的副作用。”
------解决方案--------------------
很有意思的问题
如3,4楼所说,1可能是由于死循环引起的

至于2
LZ试下这段代码
Java code

List<String>[] listArray = (ArrayList<String>[])new List[2];
listArray[0].add("0");
listArray[1].add("1");

------解决方案--------------------
忘记贴网址了,这个是那篇文章
http://www.ibm.com/developerworks/cn/java/j-jtp01255.html
------解决方案--------------------
回答 10 楼的问题:

我认为应该是这样的:编译器能够静态识别出所有的 reachable branch。而你那段程序,并不能在编译期就判定为“死循环”,所以就报错了。

我估计,如果你把 b 的定义改成 final boolean b = true; 应该就能编译通过了。我没试过,猜的 :)

------解决方案--------------------
楼主好学的精神值得大家学习哦!

第一个问题其实是基于一条简单的规则:JAVA不允许有编译器能确定的永远执行不到的语句(即使是return语句也不行!)。
所以,这个问题不是“可以不返回值”,而是“不能返回”,也就是说,在死循环后面加上返回是错的,因为这里的返回语句是永远执行不到的。

语句永远不被执行的情况有几种:出现在明确的死循环之后,出现在明确的return语句之后,出现在明确的异常抛出语句之后。
这里的“明确的”意思是编译器可以确定的,基于这个规则,下面的代码都不能编译:
Java code

int f() {
  return 0;
  System.out.println("never reach here!");  // won't compile!
}

int g() {
  while(true);  // or equally, for(;;) ;
  return 0;  // won't compile!
}

int h() {
  throw new RuntimeException();
  return 0;  // won't compile!
}

------解决方案--------------------
呵呵,关于第二个问题,读了一下sun的官方文档,发现泛型的限制还是蛮多的。

泛型只是一个编译时范畴,编译器在编译期间会对所有的泛型声明执行类型消除(Type Erasure ),也就是说,任何和运行时相关的操作都不支持泛型。只有编译器认识泛型,JVM根本不认识。所以泛型机制只是编译器方面的革新,泛型机制编译出来的字节码,并不需要一个所谓“支持泛型的JVM”来解释。
数组的类型是需要在编译时确定的,所以,创建“泛型数组”就意味着要编译器把这个泛型对象留给JVM去解释,违背了“类型消除”的原则。所以,“泛型数组”是不存在的。