方法一:创建一个显式的工厂对象,获得编译检查。
package com.cognizant.ch15;
interface FactoryI<T>{
T create();
}
class Foo2<T>{
private T x;
public <F extends FactoryI<T>> Foo2(F factory){
x=factory.create();
}
}
class IntegerFactory implements FactoryI<Integer>{
public Integer create(){
return new Integer(10);
}
}
class Widget {
public static class Factory implements FactoryI<Widget>{
public Widget create(){
return new Widget();
}
}
}
public class FactoryConstraint {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new Foo2<Integer>(new IntegerFactory());
new Foo2<Widget>(new Widget.Factory());
}
}
方法二:模版方法设计模式
package com.cognizant.ch15;
abstract class GenericWithCreate<T> {
final T element;
GenericWithCreate() {
element = create();
}
abstract T create();
}
class X {
}
class Creator extends GenericWithCreate<X> {
X create() {
return new X();
}
void f() {
System.out.println(element.getClass().getSimpleName());
}
}
public class CreatorGenetic {
public static void main(String[] args){
Creator c= new Creator();
c.f();
}
}
output:X