1

我确定这是重复的,但我的搜索关键字太常见了......我得到了很多点击,因为我不寻找的东西。我来自 C#,Java 泛型似乎有点落后于 .NET 实现,所以这对我来说非常令人沮丧。

我有一个抽象类 BaseRepository 像这样:

public abstract class BaseRepository<T, K> implements Repository<T, K> {

    private Class<T> type;
    private Class<K> keyType;

    public BaseRepository(Class<T> clazz, Class<K> kClazz) {
        type = clazz;
        keyType = kClazz;
    }

    protected Class<T> getType() {
        return type;
    }

    protected Class<K> getKeyType(){
        return keyType;
    }
}

现在我想从我的基类派生出EmployeeRepository这样的:

public class EmployeeRepository extends BaseRepository<Employee, UUID>{

}

使用 c#,我不需要付出如此巨大的努力来实例化基类,但似乎 java 的泛型实现需要您在构造函数中传递泛型类型。

那么如何为我的EmployeeRepository类创建一个无参数构造函数,以实例化具有实体类型Employee和键类型的基类UUID?我希望能够这样写:

EmployeeRepository foo = new EmployeeRepository();

...并让它用Class<Employee>and实例化抽象类Class<UUID>

4

3 回答 3

6

AFAIK,除了从默认的子类构造函数调用超类构造函数之外,没有其他办法,因此:

public EmployeeRepository() {
    super(Employee.class, UUID.class);

    ...
}
于 2013-03-11T15:18:40.567 回答
1

您可以使用反射来确定泛型参数的类型。

public abstract class BaseRepository<T, K> implements Repository<T, K> {

    private Class<T> type;
    private Class<K> keyType;

    public BaseRepository() {
        Type[] actualTypes = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments();
        this.type = (Class<T>)actualTypes[0];
        this.keyType = (Class<K>)actualTypes[1];
    }

    protected Class<T> getType() {
        return type;
    }

    protected Class<K> getKeyType(){
        return keyType;
    }
}

然而,真正的问题是:你为什么要拥有这些类型?

于 2013-03-11T15:23:25.063 回答
0

作为替代方案,使用Builder模式:

public class EmployeeRepository extends BaseRepository<Employee, UUID>{
   public static EmployeeRepository newInstance() {
       return new EmployeeRepository(Employee.class, UUID.class);
   }
   ...
}

EmployeeRepository foo = EmployeeRepository.newInstance();
于 2013-03-11T15:24:45.493 回答