作者H45 (!H45)
看板java
标题Re: [问题] generic
时间Tue Sep 5 02:15:12 2006
※ 引述《oldhead1029 (想不到)》之铭言:
: 最近也在看Generic,实在有点搞不懂Generic的真正功用在那?
: 以Map来说好了,如果程式是我们自己写的,我们一定会知道
: 里面放的是什麽型别....
: 如果使用泛型(觉得名字怪怪的,反而违反「泛」字..纯自己的想法)
: 放了别的型别的物件也是会错,跟我们在一般的取Map里的物件转型错
: 一样意思不是吗?而且相同物件不是反而限制了Map这类collection的
: 功用吗?
: 有没有大大可以举个在工作上写程式会用到的例子呢?
: 谢谢!
考虑介面和共同的父类别
public AbstractCollection<Component> getComponents() {...}
这样写的话,只要是 Component 的子类别都可以加入这个容器
public Map<String, Runnable> getMap() {...}
这个 Map 的 Key 型态必须是字串; Value 型态则必须实作 Runnable 介面
这样来看的话, Generic 并没有真的限制了容器的功用
反而加强了语法的结构,试想以後再也不用刻意为了一个未知的型态做强制转型
例如:
AbstractCollection collection = new Vector();
String result = (String) collection.iterator().next();
^^^^^^^^
过去在这边都得加上强制转型
但是一旦有了 Generic 之後,强制转型的工作就可以省下了
例如:
AbstractCollection<String> collection = new Vector<String>();
String result = collection.iterator().next();
^
不再需要强制转型了
再说,针对介面写程式,本来就是 OO 设计师的守则之一
在 Map<K, V> 的括号(?)里填入适当的 Interface ,才能让 Generic 的优点充分发挥
试想一个专案中有许多相似的类别,并且实作同一个 Interface
在容器中取出这些物件时,我们不用理会它是哪一个子类别的实体
只要藉由多型的优点,针对它的介面去操作就可以了
例如:
public static void main(String argv[]) {
AbstractCollection<Runnable> collection = new Vector<Runnable>();
collection.add(new PrintA());
collection.add(new PrintB());
collection.iterator().next().run();
}
class PrintA implements Runnable {
public void run() {
System.out.println("A");
}
}
class PrintB implements Runnable {
public void run() {
System.out.println("B");
}
}
一般的程式并不会像这个例子这麽做作
在实务上,当你发现加入容器的型态都实作某个介面或父类别时 (通常都是如此)
就可以开始考虑是否有必要在容器加上 <E> 这样的 Generic
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.115.205.85