今天在SUN网站上看关于泛型的资料,觉得它举的一个例子很好,一下让我解决了泛型的类型转换这个难题。
http://java.sun.com/docs/books/tutorial/java/generics/wildcards.html
情境:
通过笼子装动物来解释泛型的up-case and down-case。
二个类:笼子(泛型)与动物
class 笼子 <T> { }
class 动物 { }
class 狮子 extends 动物 { }
class 蝴蝶 extends 动物 { }
对象:狮子、蝴蝶和若干不同类型的笼子
一只狮子 = new 狮子()
一只蝴蝶 = new 蝴蝶 ()
一只装狮子的笼子 = new 笼子<狮子>()
这只笼子很牢固,但不密集。
一只装蝴蝶的笼子 = new 笼子<蝴蝶>()
这只乱子很密集,但不牢固。
一只可以装所有动物的笼子 = new 笼子<动物>()
这个笼子不但牢固,而且密集。
一只可以装某种动物的笼子 = new 笼子 <? extends 动物> ()
这个笼子长得什么个样子,没人知道。它可能很牢固,可能很密集,也可能两者都有。
问题:
1.
一只装狮子的笼子 .add(一只狮子)
一只装蝴蝶的笼子.add(一只蝴蝶)
2.
一只可以装所有动物的笼子.add(一只狮子)
一只可以装所有动物的笼子.add(一只蝴蝶)
3.
一只可以装所有动物的笼子 = 一只装狮子的笼子 (is a)
一只可以装所有动物的笼子 = 一只装蝴蝶的笼子 (is a)
4.
一只可以装某种动物的笼子.add(一只狮子)
一只可以装某种动物的笼子.add(一只蝴蝶)
5.
一只可以装某种动物的笼子 = 一只装狮子的笼子 (is a)
一只可以装某种动物的笼子 = 一只装蝴蝶的笼子 (is a)
解答:
1。 显然成立。
2。显然成立。
3。都成立。
因为
(一只装狮子的笼子:很牢固,但不密集。
而 一只可以装所有动物的笼子:不但牢固,而且密集。)
所以
一只装狮子的笼子 is not a 可以装所有动物的笼子
证明完毕
另一语句证明类似
4。一只可以装某种动物的笼子 能装一个狮子或者一只蝴蝶吗?那请问你究竟是用来装什么动物先。如果你决定要装狮子,因为这只笼子只能装某一种,那对不起,你不能再装蝴蝶。反之亦然。竟然不知道能装什么,那就什么也不能装了。所以这两个语句都错误。
5。都成立。
因为
(一只装狮子的笼子:很牢固,但不密集。
而 一只可以装所有动物的笼子:可能很牢固,可能很密集,也可能两者都有。)
所以
一只装狮子的笼子 是一种 可以装某种动物的笼子
证明完毕
另一语句证明类似。
补充:
对于问题4,如果一只可以装某种动物的笼子什么都装不了,那它不就是废物了吗?不然,它可以应用于泛型函数中。
如:
http://java.sun.com/docs/books/tutorial/java/generics/wildcards.html
情境:
通过笼子装动物来解释泛型的up-case and down-case。
二个类:笼子(泛型)与动物
class 笼子 <T> { }
class 动物 { }
class 狮子 extends 动物 { }
class 蝴蝶 extends 动物 { }
对象:狮子、蝴蝶和若干不同类型的笼子
一只狮子 = new 狮子()
一只蝴蝶 = new 蝴蝶 ()
一只装狮子的笼子 = new 笼子<狮子>()
这只笼子很牢固,但不密集。
一只装蝴蝶的笼子 = new 笼子<蝴蝶>()
这只乱子很密集,但不牢固。
一只可以装所有动物的笼子 = new 笼子<动物>()
这个笼子不但牢固,而且密集。
一只可以装某种动物的笼子 = new 笼子 <? extends 动物> ()
这个笼子长得什么个样子,没人知道。它可能很牢固,可能很密集,也可能两者都有。
问题:
1.
一只装狮子的笼子 .add(一只狮子)
一只装蝴蝶的笼子.add(一只蝴蝶)
2.
一只可以装所有动物的笼子.add(一只狮子)
一只可以装所有动物的笼子.add(一只蝴蝶)
3.
一只可以装所有动物的笼子 = 一只装狮子的笼子 (is a)
一只可以装所有动物的笼子 = 一只装蝴蝶的笼子 (is a)
4.
一只可以装某种动物的笼子.add(一只狮子)
一只可以装某种动物的笼子.add(一只蝴蝶)
5.
一只可以装某种动物的笼子 = 一只装狮子的笼子 (is a)
一只可以装某种动物的笼子 = 一只装蝴蝶的笼子 (is a)
解答:
1。 显然成立。
2。显然成立。
3。都成立。
因为
(一只装狮子的笼子:很牢固,但不密集。
而 一只可以装所有动物的笼子:不但牢固,而且密集。)
所以
一只装狮子的笼子 is not a 可以装所有动物的笼子
证明完毕
另一语句证明类似
4。一只可以装某种动物的笼子 能装一个狮子或者一只蝴蝶吗?那请问你究竟是用来装什么动物先。如果你决定要装狮子,因为这只笼子只能装某一种,那对不起,你不能再装蝴蝶。反之亦然。竟然不知道能装什么,那就什么也不能装了。所以这两个语句都错误。
5。都成立。
因为
(一只装狮子的笼子:很牢固,但不密集。
而 一只可以装所有动物的笼子:可能很牢固,可能很密集,也可能两者都有。)
所以
一只装狮子的笼子 是一种 可以装某种动物的笼子
证明完毕
另一语句证明类似。
补充:
对于问题4,如果一只可以装某种动物的笼子什么都装不了,那它不就是废物了吗?不然,它可以应用于泛型函数中。
如:
void 喂笼中动物 (一只可以装某种动物的笼子) {
从 这只可以装某种动物的笼子 中取出 动物 并进行喂养
}
调用:
喂笼中动物 (一只装狮子的笼子)
喂笼中动物 (一只装蝴蝶的笼子)