【Java学习】泛型接口与Generator进阶,javagenerator进阶
分享于 点击 5894 次 点评:140
【Java学习】泛型接口与Generator进阶,javagenerator进阶
【Java学习】代理 —— 学习自《Thinking In Java》
这里学习的内容要接着上一个内容。即《泛型接口学习》。
参考书上内容,我们可以很容易的定义一个填充Collection的方法:
public static <T> Collection<T> fill(Collection<T> collection,
Generator<T> generator, int n) {
for (int i = 0; i < n; i++) {
collection.add(generator.next());
}
return collection;
}
这个方法首先定义一个泛型T,返回这个泛型T的Collection接口的实例,
传入的参数有3个,
第一个Collection就是你要填充的Collection接口的实例,
第二个Generator就是你写的生成器(后面的代码),
第三个int就是填充的数量了,当然这里你可以灵活的定义,不一定是按这样写。
最后返回一个完成填充的Collection。
这里,我用2个Generator作示例:
// 通过Generator填充
Collection<Integer> collectionFibonacci = fill(
new ArrayList<Integer>(), new Fibonacci(), 20);
for (Integer integer : collectionFibonacci) {
System.out.print(integer + " ");
}
System.out.println();
// 通过Generator填充类型
Collection<BaseClass> collectionBaseClass = fill(
new ArrayList<BaseClass>(), new BaseClassGenerator(), 8);
for (BaseClass baseClass : collectionBaseClass) {
System.out.println(baseClass.toString());
}
System.out.println();
第一个是Integer的Fibonacci数列生成器,第二个是自定义的一个BaseClass生成器(代码在下面)。
通过刚才的fill方法,填充完之后打印出来。
BaseClass相关的代码在这里:
class BaseClass {
private static long counter = 0;
private final long id = counter++;
public String toString() {
return getClass().getSimpleName() + " " + id;
}
}
class AClass extends BaseClass {
}
class BClass extends BaseClass {
}
class CClass extends BaseClass {
}
class DClass extends BaseClass {
}
class BaseClassGenerator implements Generator<BaseClass>, Iterable<BaseClass> {
@SuppressWarnings("rawtypes")
private Class[] types = { AClass.class, BClass.class, CClass.class,
DClass.class };
private static Random random = new Random();
private int size = 0;
public BaseClassGenerator() {
}
public BaseClassGenerator(int size) {
this.size = size;
}
@Override
public BaseClass next() {
try {
return (BaseClass) types[random.nextInt(types.length)]
.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public Iterator<BaseClass> iterator() {
return new Iterator<BaseClass>() {
@Override
public boolean hasNext() {
return size > 0;
}
@Override
public BaseClass next() {
size--;
return BaseClassGenerator.this.next();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
}
先定义一个BaseClass作为基类,并且toString方法实现返回Class信息和计数。
定义了A,B,C,D 分别4个Class都是BaseClass的子类。
定义一个Generator类,用来生成上面4个子类之一。
继承了Generator接口,表明可以作为生成器,Iterable接口就不说了。
其中,Class[]数组里包含了上述4个类的Class信息,后面可以通过newInstance()生成实例。
这个Generator的作用就是,随机返回上述4个类的其中1个实例。
最后main的打印结果是这样的:
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
AClass 0
BClass 1
BClass 2
CClass 3
AClass 4
DClass 5
DClass 6
CClass 7
相关文章
- 暂无相关文章
用户点评