java - java 中的类型检查和泛型会生成警告

标签 java generics typechecking

我有以下内联比较器。

private static class SampleSorter implements Comparator<SampleClass>{
    public int compare(SampleClass o1, SampleClass o2) {
        if (o1 instanceof Comparable) {
            return ((Comparable) o1).compareTo(o2);
        } else if (o2 instanceof Comparable) {
            return -((Comparable) o2).compareTo(o1);
        }
        return 0;
    }
}

这会生成以下警告:

Comparable is a raw type. References to generic type Comparable<T> should be parameterized


如果我按照建议参数化类型:

        if (o1 instanceof Comparable) {
            return ((Comparable<SampleClass>) o1).compareTo(o2);

然后我收到警告...

Type safety: Unchecked cast from SampleClass to Comparable<SampleClass>


如果我进行类型检查:

    if (o1 instanceof Comparable<SampleClass>) {
        return ((Comparable<SampleClass>)o1).compareTo (o2);

我收到以下错误:

Cannot perform instanceof check against type Comparable<SampleClass>. Use the form Comparable<?> instead since generic type information will be erased at runtime


再说一遍,如果我遵循错误消息的建议:

    if (o1 instanceof Comparable<?>) {
        return ((Comparable<?>)o1).compareTo (o2);

我收到此错误:

The method compareTo(capture#4-of ?) in the type Comparable<capture#4-of ?> is not applicable for the arguments (SampleClass)


现在我不知道如何继续,我真的更喜欢没有警告和错误的代码。 如何生成具有所需行为的无警告代码?

最佳答案

您遇到的问题是编译器无法知道您所做的事情是安全的。相反,您必须相信您知道自己在做什么,并且可以添加此注释

@SuppressWarnings("unchecked")

方法或类和警告消失。

关于java - java 中的类型检查和泛型会生成警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8572982/

相关文章:

PHP:类型检查返回值是一种弥补 PHP 泛型不足的好习惯吗?

haskell - GHC 7.7 中引入的自由覆盖条件破坏了 GHC 7.6 中有效的代码

java - 如何在鼠标单击 JTextField 时清除 JTextField

Java 泛型和 Hadoop : how to get a class variable

Java泛型-使用未知类的成员方法

java - 带有方法参数的强类型 ArrayList

Rust "expected type"错误打印完全相同的不匹配类型

java - 倒数计时器? (毫秒精度)?

java - Java 中两个 Map<Long, Integer> 之间是否至少存在差异的可读方式?

java - 如何在 Selenium 中执行鼠标滚轮在 HTML5 Canvas 上滚动?