鉴于:
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
?
注意:显然,此代码示例是我的实际代码的简化版本。真正的类C
和D
都大得多,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
应该返回true
,false
或者是否(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)为,但事实显然并非如此。 为什么一个要介绍在前,另一个要介绍在后? 我主要以的形式使用泛型,并认为可能看起来很奇怪,但这是一个主观的参数,此外对于方法也是这样。您可以调用,类似于 在寻找技术解释时,我想在指