-1

我想使用泛型来注册用户。根据类型 T,我想决定要实例化哪个 Manager。这是我到目前为止所拥有的:

private <T extends SharingManager> void registerUsersInManager(List<User> usersToRegister){
    for(User u: usersToRegister){
        registry.put(u, new T(u));
    }
}

Eclipse 给我一个错误,说 T 类型不能被实例化。

我不确定我是否只是犯了语法错误,或者我是否搞砸了整个概念。是否有可能用泛型实现我想要做的事情?

4

2 回答 2

3

要在运行时创建新实例,您需要拥有 Class 对象,然后使用构造函数创建新实例。如果类是接口、抽象类或没有任何可见的构造函数,则构造可能会失败。

假设您的实现SharingManager有一个带Userarg 的构造函数,您可以将方法更改为:

private <T extends SharingManager> void registerUsersInManager(Class<T> type, List<User> usersToRegister){
    final Constructor<T> constructor = type.getConstructor(User.class);
       for(User u: usersToRegister){
        registry.put(u, constructor.newInstance(u));
    }
}
于 2013-11-11T12:57:25.730 回答
1

new T(u) 这是你不能做的事情。

泛型是使用Java 中的类型擦除实现的。大多数通用信息在编译时丢失,您无法知道 T 在运行时的实际值。这意味着您根本无法实例化泛型类型。

你可以写正确如下

private <T extends SharingManager> void registerUsersInManager(List<User> usersToRegister, Class<T> obj){
for(User u: usersToRegister){
    registry.put(u, obj.newInstance());
}
}
于 2013-11-11T12:52:49.660 回答