首页 > 解决方案 > Java:一般返回由参数指定的类型化集合

问题描述

我想要一个方法来创建一个指定接口的列表。我似乎无法得到它,因此我不必强制转换或失去我的类型安全性。

此版本需要转换 Set 并产生不安全的类型转换警告:

public static Set<? extends Setting> getSettings(Class<? extends Setting> className){
    Set<? extends Setting> result = new HashSet<>();
    try {
        Setting settingsObject = className.getDeclaredConstructor().newInstance();
        // do something with it and populate result-set
    } catch (Exception e) {
        e.printStackTrace();
    }

    return result;
}   


public static void main(String[] args)  {
    Set<LiabilitySetting> liabilitySettings = (Set<LiabilitySetting>) getSettings(LiabilitySetting.class);
    for (LiabilitySetting s: liabilitySettings) {
        s.doSomething();
    }

}

而在这个版本中,我需要在使用之前转换集合的元素

public static Set<Setting> getSettings(Class<? extends Setting> className){
    Set<Setting> result = new HashSet<>();
    try {
        Setting settingsObject = className.getDeclaredConstructor().newInstance();
        // do something with it and populate result-set
    } catch (Exception e) {
        e.printStackTrace();
    }

    return result;
}   


public static void main(String[] args)  {
    Set<Setting> liabilitySettings = getSettings(LiabilitySetting.class);
    for (Setting s: liabilitySettings) {
        ((LiabilitySetting) s).doSomething();;
    }

}

我觉得有一种方法可以编写我的方法而不会丢失类型安全且不必强制转换。有任何想法吗?

标签: javagenerics

解决方案


请改用有界类型参数。

public static <T extends Setting> Set<T> getSettings(Class<T> className) {

通配符?告诉编译器它是(或它自己)的某个子类,但编译器不知道in是否与.SettingSetting?Class?Set

当您将它绑定到类型参数时,编译器仍然知道它TSettingor的子类Setting,但现在它知道 theSet和 theClass具有相同的类型,从而无需进行强制转换。


推荐阅读