2013-03-07 173 views
3

我有以下代码:的Java类型转换,从扩展

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>

+0

因为不管你是否使用泛型,你都不能低调吗?除非'T' *是*'User',否则它是无效的。 – 2013-03-07 17:06:12

回答

7

您误解了泛型。

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

如果TFunkyUser,那么您的代码将不起作用。

+0

我现在正在使用这个:'T user2 = userClass.cast(new BaseUser(username,passwordHash));'。这是否更好? (顺便说一句,我会在5分钟内接受你的回答,当noob保护允许我¬¬) – Twinone 2013-03-07 17:14:33

+0

有了这些代码,我不再收到警告。有什么不同? – Twinone 2013-03-07 17:16:15

+0

@TwinOneAndroid - 你没有得到警告,因为它会检查转换,并且如果你传递除User.class之外的任何东西,将会抛出一个异常......这又回到'T扩展用户',因为你可以'这样做。你的原始方式不会炸毁,直到你真的试图使用'user' – 2013-03-07 17:24:32

2

T可以是任何扩展类User。你正在实例化一个新的User,即超类。因此,如果T不是刚好User类型(即一个子类),演员阵容是不安全的,并将投掷ClassCastException

+0

这个演员不是非法的,因为它的*不安全*。 – Perception 2013-03-07 17:08:10

+0

@Perception恕我直言,它不是一种安全/不安全的东西,因为'T类是'一个子类时抛出'ClassCastException',我错了吗? – sp00m 2013-03-07 17:09:25

+0

在这种情况下,*非法*转换是编译器会捕获的,而* unsafe *可能会导致运行时异常(在本例中是'ClassCastException')。 – Perception 2013-03-07 17:11:35

0

最低T可以是一个用户,实际上它也可以AdvancedUser

class AdvancedUser extends User{} 

然后如果你声明T作为一种先进的用户,因为你向上转型真正的用户对象AdvancedUser类型的程序将失败。因此,它给你一个关于不安全的转换的警告