日期:2014-05-20 浏览次数:20794 次
private String abc(){ while(true){ } }
List[] listArray = new List[]{new ArrayList<String>(), new ArrayList<String>()}; listArray[0].add("0"); listArray[1].add("1");
public static String abc(){ for(;true;){ } }
------解决方案--------------------
1、首先,試了一下,for是可以的。其次,也不是说有while循环就不用返回值,而是死循环不用返回值,编译器还是比较聪明的。(可以试试看里面放个break)
2、baidu了一下,IBM网站有篇文章,建议楼主去看看。
大概的意思是:
“在这里可以看到一种模式 —— 与泛型有关的很多问题或者折衷并非来自泛型本身,而是保持和已有代码兼容的要求带来的副作用。”
------解决方案--------------------
很有意思的问题
如3,4楼所说,1可能是由于死循环引起的
至于2
LZ试下这段代码
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语句之后,出现在明确的异常抛出语句之后。
这里的“明确的”意思是编译器可以确定的,基于这个规则,下面的代码都不能编译:
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去解释,违背了“类型消除”的原则。所以,“泛型数组”是不存在的。