如何使用泛型避免类型安全警告[重复]

Posted

技术标签:

【中文标题】如何使用泛型避免类型安全警告[重复]【英文标题】:How to avoid type safety warnings with generics [duplicate] 【发布时间】:2019-12-18 08:02:19 【问题描述】:

我正在编写自定义迭代器,但在我的 Java 代码中看到不同的警告。

这是我的代码:

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class CustomIterator<E> implements Iterator<E> 
    public static void main(String[] args) 
        List<String> a = Arrays.asList("alpha", "beta", "gamma");
        List<Integer> b = Arrays.asList(1, 2, 3);

        // Type safety: The constructor CustomIterator(Iterator...) belongs to the raw type CustomIterator. References to generic type CustomIterator<E> should be parameterized
        CustomIterator it = new CustomIterator(a.iterator(), b.iterator());
        // some logic
    

    // Type safety: Potential heap pollution via varargs parameter iterators
    public CustomIterator(Iterator<E>... iterators) 
        // some logic
    

    @Override
    public boolean hasNext() 
        // TODO Auto-generated method stub
        return false;
    

    @Override
    public E next() 
        // TODO Auto-generated method stub
        return null;
    

我刚刚在上面的代码中将警告添加为 cmets。

它发生在两个地方:

// Type safety: The constructor CustomIterator(Iterator...) belongs to the raw type CustomIterator. References to generic type CustomIterator<E> should be parameterized
CustomIterator it = new CustomIterator(a.iterator(), b.iterator());

还有这里:

// Type safety: Potential heap pollution via varargs parameter iterators
    public CustomIterator(Iterator<E>... iterators) 
        // some logic
    

我可以使用@SuppressWarnings( "unchecked", "rawtypes" ) 来压制它们,但我想知道为什么我会得到这些以及如何在不压制的情况下避免它们。

【问题讨论】:

你可能无法避免压制它们。你正在做的事情有真正的类型安全问题。实际上没有类型E 可以安全地实例化它...除了Object。换句话说,在这里使用泛型并没有任何好处。 你需要像@SafeVarargs public CustomIterator(Iterator&lt;? extends E&gt;... iterators)这样的声明 【参考方案1】:

您不能安全地将两个不同元素类型的 Iterators(Iterator&lt;String&gt;Iterator&lt;Integer&gt; 传递给您的 CustomIterator 构造函数。

如果你没有使用原始类型(如CustomIterator it),编译器会告诉你的。例如,以下内容不会通过编译:

CustomIterator<Integer> it = new CustomIterator<Integer>(a.iterator(), b.iterator());

【讨论】:

@Michael no,CustomIterator&lt;Object&gt; it = new CustomIterator&lt;Object&gt;(a.iterator(), b.iterator()); 没有通过编译(除非您将 ab 更改为 List&lt;Object&gt;)。

以上是关于如何使用泛型避免类型安全警告[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 Rust 中重复的长泛型约束

EasyMock:如何在没有警告的情况下创建泛型类的模拟?

为啥我会在这里收到类型安全警告? (泛型)

某些 Java 泛型类型转换中的类型安全警告是啥意思?

如何避免 as.numeric() 中的“警告消息:强制引入的 NA”[重复]

Java中的泛型