来自扩展的Java类型转换

时间:2013-03-07 17:02:45

标签: java types casting extends

我有以下代码:

public static <T extends User> void addUser(String username,
        String passwordHash, Class<T> userClass, File usersDir) {

    T user = (T) new User(username, passwordHash);
    UserManager.toFile(user, usersDir);
}
Eclipse给了我以下警告:

Type safety: Unchecked cast from User to T

为什么我收到警告,如果我定义了 T 来扩展用户<T extends User>

,则不会检查

3 个答案:

答案 0 :(得分:7)

你误解了泛型。

T extends User并不意味着T User;这意味着T可以是继承User的任何类。

如果TFunkyUser,则您的代码将无效。

答案 1 :(得分:2)

T可以是User的任何扩展类。您正在实例化一个新的User,即超类。因此,如果T不是完全 User类型(即子类),则转换是不安全的,并且会抛出ClassCastException

答案 2 :(得分:0)

最小T可以是用户,实际上也可以是AdvancedUser

class AdvancedUser extends User{}

如果您将T声明为高级用户,那么您的程序将失败,因为您正在将真实的User对象向上转换为AdvancedUser类型。因此,它会向您发出有关不安全演员的警告