当前位置: 首页 > 知识库问答 >
问题:

为什么使用原始类型变量会影响签名而不引用类型参数?[重复]

卫梓
2023-03-14

在研究另一个问题时,我遇到了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,那么它看起来相当反直觉,没有效率;也许是为了后面的可比性?。


共有1个答案

夏侯渊
2023-03-14

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类型的引用