代码之家  ›  专栏  ›  技术社区  ›  Twinone

从扩展的Java类型转换

  •  3
  • Twinone  · 技术社区  · 13 年前

    我有以下代码:

    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 回复  |  直到 13 年前
        1
  •  7
  •   SLaks    13 年前

    你误解了仿制药。

    T extends User 并不意味着 T User ; 这意味着 T 可以是继承的任何类 使用者 .

    如果 T FunkyUser ,您的代码无法工作。

        2
  •  2
  •   sp00m    13 年前

    T 可以是的任何扩展类 User 。您正在实例化一个新的 使用者 ,即超级类。所以,如果 T 不是 确切地 这个 使用者 类型(即子类),强制转换是不安全的 ClassCastException 将被抛出。

        3
  •  0
  •   Arsen Alexanyan    13 年前

    最小T可以是用户,实际上它也可以是高级用户

    class AdvancedUser extends User{}
    

    然后,如果您将T声明为高级用户,则您的程序将失败,因为您正在将真实的user对象升级为AdvancedUser类型。因此,它会向您发出关于不安全铸造的警告