论坛首页 Java企业应用论坛

诡异代码,麻烦各位大牛看下【泛型】

浏览 11179 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-12-02  
各位反编译用的啥软件?
通过命令行么》?
0 请登录后投票
   发表时间:2011-12-03  
同学,这个问题没有任何实际的意义哈。没有人会这么用的。这样的代码是写错了的。
0 请登录后投票
   发表时间:2011-12-05  
太诡异了,没看懂
0 请登录后投票
   发表时间: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 的,容易确定,所以就在编译期间确定了

重载也不是多态,本来就应该在编译期间确定的啊,呵呵
0 请登录后投票
   发表时间:2011-12-06  
干嘛要这么写代码呢,挑战?这些都是在规则下行的通,规则多了就可能出现冲突,不要老做一些无谓的口舌嘛,遵守规则就行了……
0 请登录后投票
   发表时间:2012-01-10  
yanmingapple 写道
干嘛要这么写代码呢,挑战?这些都是在规则下行的通,规则多了就可能出现冲突,不要老做一些无谓的口舌嘛,遵守规则就行了……

正解,什么叫规范,规范是让大家方便,遵守规范,规范之内创新才是王道
0 请登录后投票
   发表时间:2012-01-31  
葬雪晴 写道
泛型擦除+转换异常而已。。

java的泛型是伪泛型。只是编译的时候用以检查而已。。
当需要输出的时候。会强转为需要的类型。
如果类型不匹配转换不了。则会报转换异常

正解,java虚拟机里面没有泛型,
你可以声明一个 List<Integer>类型,通过反射欺骗编译器,放该对象中add任意类型,然后通过Object输出来
0 请登录后投票
   发表时间: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

---------------------------------
自己看看例子,不想废话
0 请登录后投票
   发表时间:2012-01-31  
dsjt 写道
各位反编译用的啥软件?
通过命令行么》?

jd-gui.exe 我没有遇到比他更强的
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics