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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张硕 中级黑马   /  2012-11-24 21:47  /  1800 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

集合类加泛型之后,在什么地方判断加的对象类型是不是和泛型所限制的类型的呢?求详细讲解
还有普遍的类(不是集合类)加泛型和不加在什么地方有区别?为什么?

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

12 个回复

倒序浏览
泛型是用于编译时期的,在编译时jvm会自动按照<>里面的指定类型对元素进行检查,检查不匹配就会编译失败,这样泛型就会省下向下强转和类型转换的异常,主要用于类中操作的引用数据类型不确定的时候,

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
加泛型的类在创建对象时确定该类所操作的类型,创建对象时,判定对象操作类型是否符合该类所加泛型的限制。
加泛型可以使操作更广泛的类,增强代码复用性。是多态的一种体现。泛型还可以减少类型转换,使安全性更强。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 段海涛 于 2012-11-24 22:11 编辑

泛型啊泛型,泛型就是浮云,你可以通过这样类比来获得一个最初步的理解:
你定义一个变量比如x的时候,是不是要指定x的类型?   比如 int x=1 ;   或者  char x = 'c' ;
同理,当你创建一个集合时,是不是也觉得应该指定这个集合里面允许装的数据的类型比较好呢?
否则你一会往集合里丢一个字符串对象,一会丢一个Person对象,一会又丢进去一个File对象。。。。呃,你将来想处理这个集合里面的数据的时候是不是觉得很困惑?
所以,你如果给你创建的集合(如一个TreeSet)指定它能装的数据的类型,比如你指定只能放String对象,上面的问题是不是就可以避免了呢?

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
齐银春 发表于 2012-11-24 21:57
泛型是用于编译时期的,在编译时jvm会自动按照里面的指定类型对元素进行检查,检查不匹配就会编译失败,这 ...

编译时期不是由JAVA编译器进行处理吗?和JVM有关系吗?而且我想知道具体的检查细节
回复 使用道具 举报
ljhheima 发表于 2012-11-24 21:57
加泛型的类在创建对象时确定该类所操作的类型,创建对象时,判定对象操作类型是否符合该类所加泛型的限制。 ...

能说下具体的细节吗?你说的我都知道
回复 使用道具 举报
张硕 中级黑马 2012-11-24 22:22:41
7#
段海涛 发表于 2012-11-24 22:09
泛型啊泛型,泛型就是浮云,你可以通过这样类比来获得一个最初步的理解:
你定义一个变量比如x的时候,是不 ...

如果集合类上加了泛型,限制了类型那么当向它里面添加对象的时候怎么去判断是不是这个泛型所规定的类型的呢?int型的是里面就规定好的,而集合类原来能添加object类型的,而现在加了泛型,具体的判断细节是什么呢?
回复 使用道具 举报
张硕 中级黑马 2012-11-24 22:22:58
8#
段海涛 发表于 2012-11-24 22:09
泛型啊泛型,泛型就是浮云,你可以通过这样类比来获得一个最初步的理解:
你定义一个变量比如x的时候,是不 ...

如果集合类上加了泛型,限制了类型那么当向它里面添加对象的时候怎么去判断是不是这个泛型所规定的类型的呢?int型的是里面就规定好的,而集合类原来能添加object类型的,而现在加了泛型,具体的判断细节是什么呢?
回复 使用道具 举报
张硕 发表于 2012-11-24 22:12
编译时期不是由JAVA编译器进行处理吗?和JVM有关系吗?而且我想知道具体的检查细节 ...

泛型的主要目的之一就是用来指定容器要持有什么类型的对象,而且由编译器来保证类型的正确性,上面我说的有些错误吧,确实是编译器进行检查的。泛型只是往容器里面指定了类型,然后向容器里面存储时要进行检查是否和定义的类型批不匹配 。 自己又翻了翻java编程思想感觉自己理解也就是这了,如果楼主有一些更深的理解了大家可以相互多交流交流,其实我也是一个才学习的编程者
回复 使用道具 举报
张硕 发表于 2012-11-24 22:22
如果集合类上加了泛型,限制了类型那么当向它里面添加对象的时候怎么去判断是不是这个泛型所规定的类型的 ...


比如啊,你给list加了泛型string   
List<String> yourlist =new List<String>;

那么,你往yourlist里面添加元素的时候
你就只能添加String类的 ,比如 yourlist.add("张硕");
你如果添加别的类型的数据,  比如 yourlist.add(new Person()); 编译器就会检查到添加的东西跟你泛型指定的东西不是一类,就会报错  
回复 使用道具 举报
张硕 中级黑马 2012-11-24 22:45:59
11#
段海涛 发表于 2012-11-24 22:27
比如啊,你给list加了泛型string   
List yourlist =new List;

你的意思是说如果在定义集合类时候规定了泛型的话,用add()添加对象的时候编译器会检查是不是规定的泛型?如果是定义一个int型的变量那么编译器会按照固定的int型去检查,而当集合类规定了泛型string型的或者是自定义类型的,那编译器怎么知道你规定的什么泛型,然后按照什么方式去检查的?其中有什么机制吗?
回复 使用道具 举报
张硕 中级黑马 2012-11-24 22:46:18
12#
段海涛 发表于 2012-11-24 22:27
比如啊,你给list加了泛型string   
List yourlist =new List;

你的意思是说如果在定义集合类时候规定了泛型的话,用add()添加对象的时候编译器会检查是不是规定的泛型?如果是定义一个int型的变量那么编译器会按照固定的int型去检查,而当集合类规定了泛型string型的或者是自定义类型的,那编译器怎么知道你规定的什么泛型,然后按照什么方式去检查的?其中有什么机制吗?
回复 使用道具 举报
呵呵,欣赏你的坚持精神
编译器是怎么知道你规定的什么泛型呢?请看,
  1. List<String> yourlist = new List<String>;
复制代码
你给list加了String泛型类型是不?  用尖括号清清楚楚表明了是不?
这样,编译器是不是就知道你指定的泛型类型了?
你给yourlist添加元素的时候,编译器是不是就能检查两者的类型是否匹配了?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马