先从问题说起,
思考:怎样通过SequenceInputStream(Enumeration<? extends InputStream> e)来构造。
很容易会想到Enumeration会是一个集合,但通过查找发现不是,而是一个接口。
所以不能直接new对象,当发现其有一个实现类StringTokenizer ,必然会想到,通过子类上转型,
但点进去发现,其根本就不是一个集合的子类, 因为它的dir
java.lang.Object
|__java.util.StringTokenizer
所以通过new StringTokenizer 对象也是不可取的,因为它不是集合,不能用来存储输入流对象。
那么从它子类入手是不合适的,重新返回Enumeration。 再一看它还带着泛型。然而并没有什么卵用。
再想,既然Enumeration是接口,不能new对象,也肯定不能通过Enumeration的方法返回一个Enumeration的对象。
有了,那么既然Enumeration的方法不能返回 Enumeration对象,那肯定有其他类,中的方法,可以返回Enumeration对象。
谁知道是什么类呢? 继续往下看,有个:
“ 另请参见:
Iterator, SequenceInputStream, nextElement(), Hashtable, Hashtable.elements(), Hashtable.keys(), Vector, Vector.elements()”
方法先排除,Iterator, SequenceInputStream,也排除就还剩下Vector, 不多说:点!
找:方法中有没有返回值类上是 Enumeration<E>的,
还真有,必须有嘛, Enumeration<E> elements() 返回此向量的组件的枚举。
现在再回过头来看Enumeration,什么泛型啊,方法啊,都和Iterator是一样的。
感慨过后再想想,接口原来可以这样用:
class A{
//通过内部类实现接口C
private class B implements InterfaceC{
实现接口C中的方法...
}
//提供一个方法返回接口C对象,显然是个上转型对象。
public InterfaceC getC(){
return new B();
}
}
在总结一下:
如何获取一个类(包括接口和抽象类)的对象
1,所找的类不是接口或抽象类
|--有构造方法 : 直接new
|--没构造方法
|--方法都是静态的 : 直接通过类名.调用
|--有方法不是静态的: 那么肯定有方法换回本类对象,既单例设计模式。
2,所找的类是一个接口或抽象类:
|--抽象类 : 必然有直接子类,即可通过子类创建对象。例如:Reader
|--接口: (1)首先要明白这个接口是做什么的。
对于“层次结构 中的根接口”那么一般来说它具有的功能一定有你要的,
那么就可以通过它的已知实现子类来new对象。 例如:Collection
(2)如果接口的已知子类不能满足所需要求,则考虑其他类有提供了获取该接口对象的方法,
可以在另参见 中找里面的哪个类,提供了获取该接口对象的方法。 例如:Enumeration、Iterator
(3)没有其他类提供了获取该接口的方法,
那恭喜你,可以建一个类去实现该接口,(一般建个内部类) 例如 Comparator