泛型的<?>是什么意思 本帖最后由 hahapigzhu 于 2009-09-15 10:07:51 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ?是表示要插入的类型 上面要改成 Collection <String> a = new ArrayList <String>(); 就ok了 .....其实你说的我知道...再添一个问题:? extends String的意思是一个继承String的类吗?String不是final的吗?为什么可以这样用呢? <>里放String是告诉系统从a这个变量里取出单个对象的时候当成String来用。哪里有什么extends的东西? http://www.ibm.com/developerworks/cn/java/j-jtp01255.html一篇不错的文章 <?>是泛型的类型通配符,将集合定义成<?>,初始化的时候,你传的什么参数,这个集合就只能添加该类型的参数,可扩展性较好。 通配符,若是继承需要关键词extnds jdk1.4版本之前没有泛型 什么类型的元素只要是对象就可以添加进里面 ,比如:Set set=new HashSet();可以set.add(Student s);set.add(int age);set.add(String name);这些都不会报“编译错误”,这样集合容器里什么都有,一点都不规范就会容易导致“因为程序员的一些疏忽”使程序出错而且给集合的遍历带来了很大的困难。但是1.5版本之后添加了泛型 保证集合类中的元素都是同一类型的比如:Set<Student> set=new HashSet();//泛型只需声明set.add(Student s);//通过而下面的就会报“编译错误”set.add(int age);//编译不通过set.add(String name);//编译不通过这样,在程序运行前就把错误纠正了! 补充一下用法:Set <Student> set=new HashSet();//泛型只需声明 不需要再后面加泛型Set <Student> set=new HashSet<Student>();当然这样也不会错 各位不好意思,我还打漏点东西:public void takeList(<? extends String> list){ }这个函数里的? extends String是什么意思阿?为什么可以继承String? 泛型通配符类型? extends String 是不确定传入的参数是什么类型的,只知道是String类型的子类(这他妈是谁写出来的东西,String他妈有子类么?)。这个东西只能作为返回参数,不能作为传入参数,因为只知道他是某个类型的子类,但是不确定是什么类型,所以他能够被某个类型以及父类所应用而接受,但是任何类型都不能传入。相对而言还有一个? super String,它的特性跟? extends String正好相反。你那个东西写错了要么你就是public void takeList(List<? extends String> list)要么你就是public void takeList(? extends String list) 楼上的说对了,确实是我的笔误,是public void takeList(List <? extends String> list) 确实他妈的不是个东西,这东西只是纯粹一道题目而已,因此写得这么他妈,真正的程序我想是不会有extends String这样的东西出生的,然而之所以能通过编译,我想是因为编译器不检测这个问题 其实这里的extends并不是继承的意思 只是定义了一个边界 也可以说是在泛型上加了一个限制如类C extends B B extends A 那么ArrayList<?extends B> = new ArrayList<C>();可以同时也可以new ArrayList<B>(); <?extends B>在这里只是定义?的边界为B的确是很令人恼火的东西 可以查查资料 不过说的都不是很明白 听别人说过java的泛型,是假泛型,具体什么含义忘记了楼下大牛能不呢个解释一下,为什么说java中的泛型是假泛型呢 我不知道其它的泛型是如何定义的,据说C++与.net都有泛型的概念。java的泛型只存在编译时,不存在于运行时,泛型对于java的运行时也是没有意义的,java本身已经有一整套的机制来控制运行时对象类型的对应性与安全性了,早在1.1版本就有并且在1.2版本中更加完善了。然而没有泛型的设计开发对开发人员来说始终是不安全的,那样要求开发人员去注意一些本不该注意的类型安全性,对此才有java编译时的泛型程序设计。 首先,“?”表示类型不确定,ArrayList<?> x;则 x 可以保存 ArrayList<Integer>,ArrayList<String> 等多个类型的变量,但是在执行 x.add 时,由于不知道具体类型的类型,所以不允许加入有类型的对象,比如 String。在 Java 中有且只有一个没有类型的东西:null。注意是只有 null 可以,(String)null 就不行,也不能 String n = null; x.add(n)。其次,虽然 String 是 final,但这并不妨碍 ? extends String 的使用,因为 String 本身也是符合这个 ? 的,虽然一个类是它本身的子类有点——不恰当。同理,String 本身也是符合 ? super String 中的 ? 的。 之所以说java中的泛型是假泛型,是因为java中的泛型只是编译期的一个概念,比如你使用泛型定义ArrayList<String> list = new ArrayList<String>();和ArrayList list = new ArrayList();他们生成类的字节码文件是相同的 泛型只是限制你编写的代码,不符合规范就不能通过 简单输出问题 挺有意思的问题? 请问关于自动登陆网页 在一个系统运行当中,一个接口or类如何获取实现or继承它的所有类 读大txt文件,写入数据库.提高速度的办法. 写一个注册的JFrame小应用程序,新手求助现场高手,万分感谢!!! 一道简单的JAVA事件驱动题,编译出错,请求解答? Rs.absolute(Offset)大数据量问题 GIF动画如何压缩? 使用FTPClient上传excel文件至ftp后,提示文件损坏 怎么能把一个对象存为文件,然后在从文件读出这个对象然后操作啊?能做吗? JLabel加载了图片,但显示不出来
再添一个问题:? extends String的意思是一个继承String的类吗?String不是final的吗?为什么可以这样用呢?
Set set=new HashSet();
可以
set.add(Student s);
set.add(int age);
set.add(String name);
这些都不会报“编译错误”,这样集合容器里什么都有,一点都不规范
就会容易导致“因为程序员的一些疏忽”使程序出错
而且给集合的遍历带来了很大的困难。但是1.5版本之后添加了泛型 保证集合类中的元素都是同一类型的
比如:
Set<Student> set=new HashSet();//泛型只需声明
set.add(Student s);//通过
而下面的就会报“编译错误”
set.add(int age);//编译不通过
set.add(String name);//编译不通过
这样,在程序运行前就把错误纠正了!
不需要再后面加泛型
Set <Student> set=new HashSet<Student>();
当然这样也不会错
public void takeList(<? extends String> list){
}
这个函数里的? extends String是什么意思阿?为什么可以继承String?
? extends String 是不确定传入的参数是什么类型的,只知道是String类型的子类(这他妈是谁写出来的东西,String他妈有子类么?)。这个东西只能作为返回参数,不能作为传入参数,因为只知道他是某个类型的子类,但是不确定是什么类型,所以他能够被某个类型以及父类所应用而接受,但是任何类型都不能传入。相对而言还有一个? super String,它的特性跟? extends String正好相反。
你那个东西写错了
要么你就是public void takeList(List<? extends String> list)
要么你就是public void takeList(? extends String list)
public void takeList(List <? extends String> list)
确实他妈的不是个东西,这东西只是纯粹一道题目而已,因此写得这么他妈,真正的程序我想是不会有extends String这样的东西出生的,然而之所以能通过编译,我想是因为编译器不检测这个问题
其实这里的extends并不是继承的意思 只是定义了一个边界 也可以说是在泛型上加了一个限制
如类C extends B B extends A 那么ArrayList<?extends B> = new ArrayList<C>();可以
同时也可以new ArrayList<B>(); <?extends B>在这里只是定义?的边界为B
的确是很令人恼火的东西 可以查查资料 不过说的都不是很明白
楼下大牛能不呢个解释一下,为什么说java中的泛型是假泛型呢
java的泛型只存在编译时,不存在于运行时,泛型对于java的运行时也是没有意义的,java本身已经有一整套的机制来控制运行时对象类型的对应性与安全性了,早在1.1版本就有并且在1.2版本中更加完善了。
然而没有泛型的设计开发对开发人员来说始终是不安全的,那样要求开发人员去注意一些本不该注意的类型安全性,对此才有java编译时的泛型程序设计。
ArrayList<?> x;
则 x 可以保存 ArrayList<Integer>,ArrayList<String> 等多个类型的变量,
但是在执行 x.add 时,由于不知道具体类型的类型,所以不允许加入有类型的对象,比如 String。
在 Java 中有且只有一个没有类型的东西:null。
注意是只有 null 可以,(String)null 就不行,也不能 String n = null; x.add(n)。其次,虽然 String 是 final,但这并不妨碍 ? extends String 的使用,因为 String 本身也是符合这个 ? 的,虽然一个类是它本身的子类有点——不恰当。同理,String 本身也是符合 ? super String 中的 ? 的。
之所以说java中的泛型是假泛型,是因为java中的泛型只是编译期的一个概念,比如你使用泛型定义ArrayList<String> list = new ArrayList<String>();和ArrayList list = new ArrayList();
他们生成类的字节码文件是相同的 泛型只是限制你编写的代码,不符合规范就不能通过