java - 钻石运营商;初始化参数化泛型类

标签 java generics collections initialization

人们常常需要一组快速的值,以便能够对其进行迭代。我不想手动创建实例、添加项目或执行众所周知的构造函数初始化,从数组列表中创建一个集合 (Set<String> mySet = new HashSet<String>(Arrays.AsList("a", "b", "c"))),我想创建一个函数来为我完成这项工作。

除此之外,我还想提供通用参数 <S>用于集合类,我还想提供通用参数 <T> - Collection 的实际类型.

所以,我的第一个方法如下:

public static <T extends Collection<S>, S> T initializeCollection(Class<T> concreteClass, S... objects) {
    T result;

    try {
        result = concreteClass.newInstance();
        for (S s : objects) {
            result.add(s);
        }

        return result;
    } catch (InstantiationException e) {
        return null;
    } catch (IllegalAccessException e) {
        return null;
    }
}

这很好用,可以像这样使用:

LinkedList<String> myList = StaticHelper.initializeCollection(LinkedList.class, "a", "b");

HashSet<Integer> mySet = StaticHelper.initializeCollection(HashSet.class, 1,2,3,4,5);

根据我目前的测试,它按预期工作。唯一的问题是 validator 声明正在进行未保存的类型转换。使用集合的示例, validator 说

 Type safety: The expression of type HashSet needs unchecked conversion to conform to HashSet<Integer>

当我仔细查看 IDE 为我的函数声明的返回值时,它看起来像这样:

 <HashSet, Integer> HashSet my.namespace.helper.CollectionHelper.initializeCollection(Class<HashSet> concreteClass, Integer... objects)

因此验证者 ofc 认为,他必须从 HashSet 进行取消保存转换。至 HashSet<Integer> .

但在我看来,函数的返回值是T ,这几乎被定义为 Collection<S> - 而不是 Collection .

现在我想知道是否:

  • 我的函数有问题,真的发生了未保存的类型转换
  • IDE 存在问题,未显示正确的 returnValue,因此 validator 无法正常工作。

侧节点: 即使已经发布了一个很好的替代方案(我已经在使用),我还是对这个问题的解决方案很感兴趣。

public static <T extends Collection<S>, S> T<S> initializeCollection ...

或使用

... initializeCollection(HashSet<Integer>.class,...

显然是无效语法,但基本上看起来需要什么。

最佳答案

不是真正的直接答案,但您可以通过以下方式使其更简单:

@SafeVarargs
public static <T extends Collection<S>, S> T initializeCollection(T collection, S... objects) {
    Collections.addAll(collection, objects);
    return collection;
}

并调用它:

HashSet<Integer> mySet = initializeCollection(new HashSet<>(), 1, 2, 3, 4, 5);

关于java - 钻石运营商;初始化参数化泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21576082/

相关文章:

java - Selenium 代码在延迟加载的 Web 元素中水平滚动

java - DexGuard - 使用 Robolectric 加密类 NullPointerException

java - 休息响应中重复的 Swagger 鉴别器字段

java - JFreeChart:如何更改 XYPlot 前景色?

java - 为什么不能在 Java 中创建通用填充方法?

java - 桥接方法创建

java - Java 接口(interface)通过设计来强制执行其实现者的未知方法的输出类型?

python - 列表是否有简短的包含功能?

java - 在返回之前在收集流中过滤收集流

java - 带有字符串对象的简单集合,允许以 0(1) 操作进行搜索