A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ゞSunペ果果つ 中级黑马   /  2013-5-5 11:34  /  1666 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ゞSunペ果果つ 于 2013-5-6 09:02 编辑

  Vector v1=new Vector<String>();
  v1.add("abc");
  v1 .add(1);
  System.out.println(v1.get(0));
  System.out.println(v1.get(1));

  Vector v1=new Vector();
  v1.add("abc");
  v1 .add(1);
  System.out.println(v1.get(0));
  System.out.println(v1.get(1));
是不是就一副德行了?虽然实例化第一种的时候有限制的,但是还是可以插入Int,也就失去了限制的目的
虽然这个情况实际中我们都不会这样用,但是我还是想问问,他们是不是其实一副德行了?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

8 个回复

倒序浏览
应该 是改成Vector<String> v1=new Vector<String>();
如果 是Vector v1=new Vector<String>(); 编译阶段认为,v1是Vector类型,而不是 Vector<String>。运行阶段才会知道v1实际类型是 Vector<String>。但是运行阶段,jvm又会把类型限制去掉。以至于运行能过。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
java的泛型是一种伪泛型,就是只在编译的时候检查泛型类型,在多态中有一句话是说编译看左边,运行看右边。所以你要是这样写的话Vector v1=new Vector<String>(); 编译阶段认为,v1可以装任何类型的。
Vector v1=new Vector()和Vector v1=new Vector<String>();在编译时对于jvm是一样的。
运行的时候就不会检查类型了,就像我们使用反射可以给一个存储Integer类型的集合存放String类型
  1. try {
  2.                         ArrayList<Integer> list = new ArrayList<Integer>();
  3.                         Method add = ArrayList.class.getDeclaredMethod("add", Object.class);
  4.                         add.invoke(list, "fancy");
  5.                         System.out.println(list.get(0));
  6.                 } catch (Exception e) {
  7.                         e.printStackTrace();
  8.                 }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
山西_李帅 来自手机 中级黑马 2013-5-5 12:58:03
板凳
楼主你左边没有限制范型。应该是Vector <String> v1 = new Vector <String> ();
回复 使用道具 举报
尹桥印 发表于 2013-5-5 11:41
我觉得吧,第二种是object类型的,object是万能的。任何类型都可以吧?第一种不是支持任何呢,现在求大神解 ...

嗯楼下讲的都很有道理
回复 使用道具 举报
吴文彬 发表于 2013-5-5 11:42
应该 是改成Vector v1=new Vector();
如果 是Vector v1=new Vector(); 编译阶段认为,v1是Vector类型,而不 ...

非常感谢思路清晰了,呵呵遇到问题总想搞明白点
回复 使用道具 举报
harborbest 发表于 2013-5-5 11:58
java的泛型是一种伪泛型,就是只在编译的时候检查泛型类型,在多态中有一句话是说编译看左边,运行看右边。 ...

谢谢了,挺对的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马