您可以做的是在超类中编写实例化代码,然后为每个特定的泛型类型扩展它(子类中需要很少或不需要代码,但子类是强制性的,因为它们是避免类型擦除的唯一方法):
abstract class MyGeneric<T> {
private T instance;
public MyGeneric(String str) {
// grab the actual class represented by 'T'
// this only works for subclasses of MyGeneric<T>, not for MyGeneric itself !
Class<T> genericType = (Class<T>) ((ParameterizedType)getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
try {
// instantiate that class with the provided parameter
instance = genericType.getConstructor(String.class).newInstance(str);
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
}
class MyUser extends MyGeneric<User> {
public MyUser() {
// provide the string to use for instantiating users...
super("userStr");
}
}
class User { /*...*/ }
编辑:制作泛型类abstract
以强制使用子类。
它也可以与匿名类一起使用,例如:
new MyGeneric<User>("..string...") {}
我认为这是您可以获得的最接近您最初目标的方式...