锁定老帖子 主题:诡异代码,麻烦各位大牛看下【泛型】
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-12-02
各位反编译用的啥软件?
通过命令行么》? |
|
返回顶楼 | |
发表时间:2011-12-03
同学,这个问题没有任何实际的意义哈。没有人会这么用的。这样的代码是写错了的。
|
|
返回顶楼 | |
发表时间:2011-12-05
太诡异了,没看懂
|
|
返回顶楼 | |
发表时间:2011-12-05
dsjt 写道 budairenqin 写道 huanglei7211 写道 请各位先猜下结果,然后执行代码
代码一: import java.util.ArrayList; import java.util.List; public class Test004 { public static void main(String[] args) { List lst = new ArrayList<String>(); lst.add(1); lst.add("Test004"); List<Integer> ls = lst; ls.add(2); for (int i = 0; i < ls.size(); i++) { System.out.println(ls.get(i)); } } } 代码二: import java.util.ArrayList; import java.util.List; public class Test005 { public static void main(String[] args) { List lst = new ArrayList<String>(); lst.add(1); lst.add("Test004"); List<String> ls = lst; ls.add("Test0041"); for (int i = 0; i < ls.size(); i++) { System.out.println(ls.get(i)); } } } 执行命令 javap -c Test 代码一有如下指令: 56: invokevirtual #43; //Method java/io/PrintStream.println:(Ljava/lang/Ob ject;)V 代码二有如下指令: 57: invokevirtual #47; //Method java/io/PrintStream.println:(Ljava/lang/St ring;)V 代码二会出现类型转换(Integer转String)错误 有点疑问,调用重载方法,编译期间就确定了么 ? 是不是 integer 和 string 都是 final 的,容易确定,所以就在编译期间确定了 重载也不是多态,本来就应该在编译期间确定的啊,呵呵 |
|
返回顶楼 | |
发表时间:2011-12-06
干嘛要这么写代码呢,挑战?这些都是在规则下行的通,规则多了就可能出现冲突,不要老做一些无谓的口舌嘛,遵守规则就行了……
|
|
返回顶楼 | |
发表时间:2012-01-10
yanmingapple 写道 干嘛要这么写代码呢,挑战?这些都是在规则下行的通,规则多了就可能出现冲突,不要老做一些无谓的口舌嘛,遵守规则就行了……
正解,什么叫规范,规范是让大家方便,遵守规范,规范之内创新才是王道 |
|
返回顶楼 | |
发表时间:2012-01-31
葬雪晴 写道 泛型擦除+转换异常而已。。
java的泛型是伪泛型。只是编译的时候用以检查而已。。 当需要输出的时候。会强转为需要的类型。 如果类型不匹配转换不了。则会报转换异常 正解,java虚拟机里面没有泛型, 你可以声明一个 List<Integer>类型,通过反射欺骗编译器,放该对象中add任意类型,然后通过Object输出来 |
|
返回顶楼 | |
发表时间:2012-01-31
public static void main(String[] args) { test(); } public static void test() { List<Integer> list = new ArrayList<Integer>(); //添加整形 list.add(1); try { Class c = List.class; Method m = c.getDeclaredMethod("add", Object.class); //通过反射添加其他类型 m.invoke(list, "我放个字符串"); m.invoke(list, new Date()); System.out.println("list长度:" + list.size()); for (Object obj : list) { System.out.println(obj); } } catch (Exception e) { e.printStackTrace(); } } 执行结果: list长度:3 1 我放个字符串 Tue Jan 31 16:51:19 CST 2012 --------------------------------- 自己看看例子,不想废话 |
|
返回顶楼 | |
发表时间:2012-01-31
dsjt 写道 各位反编译用的啥软件?
通过命令行么》? jd-gui.exe 我没有遇到比他更强的 |
|
返回顶楼 | |