繁体   English   中英

Java:一般返回由参数指定的类型集

[英]Java: generically return a typed Set specified by parameter

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

此版本需要转换 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();;
    }

}

我觉得有一种方法可以在不丢失类型安全且无需强制转换的情况下编写我的方法。 有任何想法吗?

改用有界类型参数。

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

通配符? 告诉编译器它是Setting (或Setting本身)的某个子类,但编译器不知道? Class是一样的? Set

当你将它绑定到一个类型参数时,编译器仍然知道TSettingSetting的子类,但现在它知道SetClass具有相同的类型,不需要强制转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM