在研究另一个问题时,我遇到了1.8的这个有趣的行为。0_112Sun-Oracle编译器(我没有和其他人一起测试过):
import java.util.List;
interface Alpha<T> {
List<Integer> intList();
}
interface Beta {
List<Integer> intList();
}
class Main {
public static void main(String[] args) {
Alpha rawAlpha = null;
Alpha<Character> charAlpha = null;
Alpha<?> qmAlpha = null;
Beta beta = null;
for (Integer i : charAlpha.intList()) {}
for (Integer i : qmAlpha.intList()) {}
for (Integer i : beta.intList()) {}
for (Integer i : rawAlpha.intList()) {}
}
}
编译器仅在最后一个for循环失败:
error: incompatible types: Object cannot be converted to Integer
for (Integer i : rawAlpha.intList()) {}
^
1 error
所以尽管有intList()
返回列表类型list
请注意,如果我们声明一个非通用接口
Beta
,这在理论上等同于引用原始Alpha
,则没有问题。
这是预期的行为吗?有人能指出语言规范中涵盖这一点的段落吗?如果这至少不是一个bug,那么它看起来相当反直觉,没有效率;也许是为了后面的可比性?。
JLS 4.8中的JLS位(有点不清楚)说明了这一点:
未从其超类或超接口继承的原始类型C的构造函数(§8.8)、实例方法(§8.4,§9.4)或非静态字段(§8.3)的类型是对应于在对应于C的泛型声明中删除其类型的原始类型。
既然rawAlpha
是一种原始类型,rawAlpha的类型。intList
是对列表的擦除
至于为什么,我手边没有引用,但是原始类型只是Java向后兼容。这意味着它们只需要像泛型之前一样工作;你要求的是代码比以前更好一点。这不是不合理的,但这不是他们决定的。:-)
问题内容: 我有一个笼子课: 我试图在另一个类main方法中实例化Cage对象: 我收到错误:笼子是原始类型。泛型Cage的引用应参数化。我尝试了几个想法,但对这种棘手的语法感到困惑:o( 问题答案: 是通用类型,因此您需要指定一个类型参数,例如这样(假设有一个): 您可以使用任何扩展的类型(甚至是自身)。 如果省略type参数,那么在这种情况下最终得到的是。但是,即使这是您想要的,您仍应明确声明
是否可以只使用一行代码就将输入变量的数据类型(可以是任何基元类型,int、bool、float、double)作为字符串返回?我知道对于字符串类型,使用和可以很容易地做到这一点,但我不确定如何使用这些方法返回基元类型的类型。我还想保持我的代码非常简短,最好只用一行。 我到处找了找,找不到任何地方,这个问题已经以我要求的方式得到了回答。
这是我的代码,vue3+typescipt 但是 typescript 推断的类型不一致 在 v-for 中遍历对象时,key被推断为string | number 类型,这就导致 input.name 无法接受 number 类型而类型报错。 有没有大佬能解释下。为什么key会被推断为 string | number 类型
问题内容: 我有以下课程(来自简单的Spring教程) 其中Validator类是Spring 2.5中的类。 如果我尝试向其中添加参数,则supports方法显示警告(Class是原始类型。对泛型类型Class的引用应进行参数化) 我收到以下错误: 关于这种类型的问题有很多线索,但是我想获得一个完整的答案并真正理解它,而不会用“隐藏”这个问题! 问题答案: 接口使用原始类型声明该方法。在这种情况
问题内容: ArrayList仅接受引用类型作为其元素,而不接受原始数据类型。尝试这样做时会产生编译时错误。 这背后的概念是什么?似乎是一个限制,不是吗? 问题答案: Java的所有收集类都存储它们收集的对象的内存位置。基本值不 适合 同一定义。 为避免此问题,JDK5及更高版本具有 自动装箱功能 -其中,将原语转换为适当的对象,然后在添加或从集合中读取原语时将其转换回原样。请参阅有关此主题的官方
编译此代码会给出“错误:将'const int'绑定到'int类型的引用