当前位置: 首页 > 面试题库 >

为什么会出现“ instanceof的非法泛型类型”?

屈俊远
2023-03-14
问题内容

鉴于:

public class C<T> {
    private class D {
        public boolean equals( Object o ) {
            if ( !(o instanceof D) )    // line 4
                return false;
            D other = (D)o;             // line 6
            return i == other.i;
        }
        int i;
    }
}

我得到:

C.java:4: illegal generic type for instanceof
          if ( !(o instanceof D) )
                              ^

我还会收到关于第6行的“未经检查的演员表”警告。为什么?该o不是 一个泛型类型-
它只是一个普通的Object。如何equals()通过检查和强制转换为实例来正确实现D

注意:显然,此代码示例是我的实际代码的简化版本。真正的类CD都大得多,D是一个private内部类C其实现中使用。

仅供参考:实数D确实使用了通用参数T


问题答案:

o不是通用类型-只是普通对象。

那不是问题。问题…和两个编译错误的根本原因…是D泛型类。它是泛型的,因为它是泛型类中的非静态嵌套类。其完全限定名称为some.pkg.C<T>.D

仅供参考:实数D确实使用了通用参数T。

而事实上,它 可以 利用的T是什么使D一个通用类。

您无法使用instanceof D(D)通用类型擦除的原因。基本上,运行时无法区分(say)C<String>.D和的类型C<Integer>.D。并且由于无法做到这一点,因此无法确定是否instanceof D应该返回truefalse或者是否(D)应该成功或抛出ClassCastException

一种解决方案是将其声明D为静态。但这不适用于您的“实数D”,因为静态类无法使用封闭类中的泛型类型参数。您的“ FYI”表示这样做。

另一种解决方案是实例化外部类C传递给它的实际类型的T作为java.lang.Class<T>实例。然后使用该Class实例来实现运行时类型检查并根据需要进行强制转换。这很可能是混乱的。

第三种解决方案是 仔细 分析代码,并确定@SuppressWarning注释是否安全,以禁止显示“不安全的强制转换”等警告。

什么类型的擦除?“ o”直接是对象类型。

实际上Object是变量的 声明 类型o。实际对象很可能具有其他类型,并且正是 类型(D例如,如果是实例)将经受类型擦除。



 类似资料:
  • 问题内容: 我有一个旧类,该类本身不是泛型,但其方法返回类型之一使用泛型: 使用泛型返回字符串的集合。因此,我可以进行遍历,而无需将元素强制转换为: 但是,如果我将自己更改为通用名称,但其他所有内容均保持不变: 然后继续使用对的非泛型引用,不再返回,而是返回非类型。因此,客户端代码无法编译: 为什么是这样?有哪些解决方法? 我的猜测是,通过使用对泛型类的非泛型引用,Java将关闭整个类的所有泛型。

  • 我想说得具体一点。我有一个名为Result的类和一个名为Result的派生类 这些类在方法中用作返回类型。为此,我创建了这个helper类: 正如您所看到的,上面的代码对于成功有两种返回类型,一种是如果您不想返回任何东西,另一种是如果您想返回一些东西,但是失败的结果永远不会返回什么东西。这是不必要的,只是一个错误消息。这使我想到以下问题:当我想创建一个可以使用返回类型返回Success,而不使用返

  • 问题内容: 我输入要获取的销售金额(按输入)乘以定义的营业税(0.08),然后打印总金额(营业税乘以销售金额)。 我碰到这个错误。有人知道什么地方可能有问题或有什么建议吗? 问题答案: 返回一个字符串(一个字符序列)。在Python中,将字符串和浮点数相乘并没有定义的含义(而将字符串和整数相乘则具有以下含义:is ;多少是多少?请不要回复)。您需要将字符串解析为数字值。 您可能要尝试:

  • 问题内容: 我正在大学学习基础知识,并且希望对Eclipse中的以下错误有所帮助:“对于类型ShopCLI,未定义方法getCost()”& 这是我的代码 问题答案: 方法是在订单类中定义的,而不是在类中定义的。所以你的代码: 应该改为

  • 编译时,此代码将产生以下+错误: 问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?

  • 在研究泛型时,我注意到泛型方法和泛型类型(类或接口)在类型引入语法上的一个差异使我感到困惑。 泛型方法的语法为 文件上说 为了彼此保持一致,我希望方法语法为 ,或者类型语法(for class)为,但事实显然并非如此。 为什么一个要介绍在前,另一个要介绍在后? 我主要以的形式使用泛型,并认为可能看起来很奇怪,但这是一个主观的参数,此外对于方法也是这样。您可以调用,类似于 在寻找技术解释时,我想在指