学习关于泛型和容器的问题 在看Thinking in java的泛型和深入容器研究,特别是泛型那章后半部分,搞得头好晕呀.....深入容器研究好像不结合JDK源代码没法学的样子? 各位是怎么学过来的呀? 谈下经验? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我也有点晕 简单我会 不过像这种的TreeSet(Collection<? extends E> c)这里面的Collection<? extends E>我有点不太懂...看文章说的又是很多 看完有点晕... Thinking in JAVA的例子还是很多,不过都是前后结合的,一个例子可能贯穿一个章节,你应该每个都看懂,并且结合API看,仔细了解一个他调用的每个方法的过程,看完后最好自己实践一下,不然很难掌握 对于泛型,个人觉得,多敲几次代码,当你敲多几次的时候就会突然明白的我学的时候没学泛型(因为我学的是1.4的),后来有看到泛型的介绍,去看jdk文档,试着敲一些代码出来,刚开始也不理解,多试几次就懂了其实自己去设计一个泛型的线性链表,试着设计出来,并且用它,如果能做到的话,你就能理解了至于容器研究,没研究过 1)泛型的基本原理先弄清楚,比如擦除大法2)练习用泛型自己定义类,方法等等3)结合集合类框架在研究我觉得最重要还要理解它其中的原理,可以看看 core java 这种问题论坛里是说部清楚的,要动手去做,Google一下,用实践来告诉自己@ 类比一下C++的泛型,不如让自己的思想回到学习编程的原点,如果是你,你为什么要设计泛型,用起来好处在哪里?举个例子:比如Thinking in Java里面提到利用泛型实现的元组,不正是为了解决程序语言里return只能返回单个值的问题么原来C++里面的Template,STL等,也充分利用了泛型编程的好处,个人拙见,就在一个字:泛!泛就是要适应各种类型,这样重复的代码不用多次编写,仅仅在运行时决定实际类型就好了。各种语言对于泛型的支持不一样,但思想是统一的。 我感觉core java和the java programming language将的比较清楚. 泛型得弄清楚下面这些的区别1,List2,List<Object>3,List<Number>4,List<?>5,List<? extends Number>6,List<? super Long>普通的泛型使用估计没啥问题,但是带上 ? 的泛型就会变得很复杂。对于 <? super T> 和 <? extends T> 看看这个例子:如果要将某一个数组中的元素拷贝至另一个的话1,先看看这个方法签名: public static <T> void copy(List<T> src, List<T> dest)如果 src 和 dest 是相同泛型参数的话,这个签名是没有问题,但是由于泛型类与数组不一样,由于泛型类并不具有协变性,也就是说下面的代码是错误的: List<Object> objs = new ArrayList<Long>();数组是协变性的,下面的代码是正确的: Object[] objs = new Long[4];用这个 copy 方法的话,如果 src 是 List<Long>,而 dest 是 List<Object> 的话,这样就会产生编译错误。但是实际上 List<Long> 中的每一个元素是可以赋值给 List<Object> 的,因此这个 copy 方法签名还有待完善。由于泛型类不具有协变性,但是 Java 的泛型提供了一个通配符类型 ? 使用这个可以将泛型类变成协变的,下面的代码是正确的: List<? extends Object> objs = new ArrayList<Long>();<? extends Object> 表示泛型是 Object 或者是 Object 的子类型,同理<? super Long> 表示泛型是 Long 或者是 Long 的父类型。这样就可以把 copy 方法完善成为: public static <T> void copy (List<? extends T> src, List<? super T> dest)至于其他的,看看下面的语句哪些正确的,哪些是不正确的?Pair 是个泛型类,SubTypeOfPair 是 Pair 的子类Collection<Pair<String, Long>> c1 = new ArrayList<Pair<String, Long>>();Collection<Pair<String, Long>> c2 = c1; // s1Collection<Pair<String, ?>> c3 = c1; // s2Collection<? extends Pair<String, ?>> c4 = c1; // s3Collection<SubTypeOfPair<String, Long>> c1 = new ArrayList<SubTypeOfPair<String, Long>>();Collection<Pair<String, Long>> c2 = c1; // s4Collection<SubTypeOfPair<String, Long>> c3 = c1; // s5Collection<Pair<String, ?>> c4 = c1; // s6Collection<? extends Pair<String, ?>> c5 = c1; // s7 多功能表达式解析器 String编译器优化问题 一个关于vector的小问题 一道外企面试题 JFrame双击事件 怎么用java在vista下创建一个所有用户都可以访问的文件 如何配置使得weblogic8可以使用jbuilder9的jdatastore 如何用source safe来管理java团队开发 关于Date类 拜托,帮我看看出了什么问题!为什么总说:add(panel1)出错? [讨论区](JDBC高手请进)用连接池写的JDBC代码支持事务处理吗,性能又如何? Float取值不准确
结合API看,仔细了解一个他调用的每个方法的过程,看完后最好自己实践一下,不然很难掌握
我学的时候没学泛型(因为我学的是1.4的),后来有看到泛型的介绍,去看jdk文档,试着敲一些代码出来,刚开始也不理解,多试几次就懂了
其实自己去设计一个泛型的线性链表,试着设计出来,并且用它,如果能做到的话,你就能理解了至于容器研究,没研究过
2)练习用泛型自己定义类,方法等等
3)结合集合类框架在研究我觉得最重要还要理解它其中的原理,可以看看 core java
2,List<Object>
3,List<Number>
4,List<?>
5,List<? extends Number>
6,List<? super Long>普通的泛型使用估计没啥问题,但是带上 ? 的泛型就会变得很复杂。对于 <? super T> 和 <? extends T> 看看这个例子:如果要将某一个数组中的元素拷贝至另一个的话1,先看看这个方法签名:
public static <T> void copy(List<T> src, List<T> dest)如果 src 和 dest 是相同泛型参数的话,这个签名是没有问题,但是由于泛型类与数组不一样,
由于泛型类并不具有协变性,也就是说下面的代码是错误的:
List<Object> objs = new ArrayList<Long>();数组是协变性的,下面的代码是正确的:
Object[] objs = new Long[4];用这个 copy 方法的话,如果 src 是 List<Long>,而 dest 是 List<Object> 的话,这样
就会产生编译错误。但是实际上 List<Long> 中的每一个元素是可以赋值给 List<Object> 的,
因此这个 copy 方法签名还有待完善。由于泛型类不具有协变性,但是 Java 的泛型提供了一个通配符类型 ? 使用这个可以将泛型类变
成协变的,下面的代码是正确的:
List<? extends Object> objs = new ArrayList<Long>();<? extends Object> 表示泛型是 Object 或者是 Object 的子类型,同理
<? super Long> 表示泛型是 Long 或者是 Long 的父类型。这样就可以把 copy 方法完善成为:
public static <T> void copy (List<? extends T> src, List<? super T> dest)至于其他的,看看下面的语句哪些正确的,哪些是不正确的?Pair 是个泛型类,SubTypeOfPair 是 Pair 的子类Collection<Pair<String, Long>> c1 = new ArrayList<Pair<String, Long>>();Collection<Pair<String, Long>> c2 = c1; // s1
Collection<Pair<String, ?>> c3 = c1; // s2
Collection<? extends Pair<String, ?>> c4 = c1; // s3Collection<SubTypeOfPair<String, Long>> c1 = new ArrayList<SubTypeOfPair<String, Long>>();Collection<Pair<String, Long>> c2 = c1; // s4
Collection<SubTypeOfPair<String, Long>> c3 = c1; // s5
Collection<Pair<String, ?>> c4 = c1; // s6
Collection<? extends Pair<String, ?>> c5 = c1; // s7