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

原始类型成员丢失了通用类型

宗政霄
2023-03-14
问题内容

使用泛型时,我发现了一个奇怪的行为。

在此类中Foo<T>,该strings成员与T以下内容无关:

package test;
import java.util.ArrayList;

public class Foo<T> {
    ArrayList<String> strings;

    T getSome() {
        return null;
    }
}

该类在main中使用:

package test;

public class Main {

    public static void main() {
        Foo<Integer> intFoo = new Foo<>();
        Integer i = intFoo.getSome();
        String s1 = intFoo.strings.get(0);

        Foo rawFoo = new Foo();
        Object o = rawFoo.getSome();
        String s2 = rawFoo.strings.get(0); // Compilation error on this line
    }
}

编译错误为“类型不兼容。必需:找到的字符串:对象”。

似乎Java忘记了使用原始类型时的Stringtype参数。ArrayList``Foo

我的Java版本是1.7.0_21


问题答案:

简而言之,由于rawFoo是原始的,它的非静态成员也变为原始的。

JLS§4.8中对此进行了概述:

更准确地说,原始类型定义为以下之一:

  • 通过采用通用类型声明的名称而没有随附的类型参数列表而形成的引用类型。

  • 数组类型,其元素类型为原始类型。

  • 原始类型R的非静态成员类型,它不继承自R的超类或超接口

注意最后一个项目符号。



 类似资料:
  • 问题内容: 考虑以下方法: 和 这两种方法有什么区别?如果没有差异,为什么要使用第二个? 问题答案: 不允许您在列表中添加对象。请参阅下面的程序。这是我们传递给method的特定列表类型。 特定方式,列表是使用特定类型创建的,并传递给method 。不要与 单词 混淆。 具体可以是任何普通对象,例如Dog,Tiger,String,Object,HashMap,File,Integer,Long

  • 问题内容: 这是hrert的问题Generic类与其他类型的Collectiongetter的后续文章。如果您可以为我的问题找到更好的标题,请随时对其进行编辑: 下面的代码包含一个具有返回类型方法的通用类和具有返回类型方法的另一个方法,显然与。 现在,如果我实例化一个原始数据(我永远不会做,所以这个问题更多是一个理论问题,以帮助理解正在发生的事情),那么在增强的for循环中调用该方法将不起作用,因

  • 我正在学习Spring,我只是在玩豆子范围。 我将附上代码,然后描述我想做的事情。 到目前为止,我已经创建了一个 点类别: 我创建了一个三角形类,其中有3个Point类的实例: 以下是spring.xml: 这是主类: 所以,你会看到三个豆子的豆范围,,和是,但它们是的成员,其范围默认为Spring 因此,我的假设是,这应该不起作用,除非我能以某种方式在我的< code>Triangle类中获取<

  • 如果类型参数在创建期间传递了npt,则原始类型是泛型类或接口的对象。 以下示例将展示上述概念。 例子 (Example) 使用您选择的任何编辑器创建以下Java程序。 GenericsTester.java package com.wenjiangs; public class GenericsTester { public static void main(String[] args) {

  • 问题内容: 我很好奇Java的类和double的原始类型之间的性能差异是什么。因此,我创建了一个基准测试,发现类类型比原始类型慢3到7倍。(在本地计算机OSX上为3x,在ideone上为7x) 这是测试: http://ideone.com/fDizDu 那么为什么Double类型要慢得多呢?为什么还要实施它以允许数学运算符? 问题答案: 那么为什么Double类型要慢得多呢? 因为该值包装在需要

  • 问题内容: 我正在一个Swift操场上玩,正在上一堂新课。由于某种原因,我不断收到这样的错误:类“没有成员类型”,其名称的常量前面定义了三行。这是代码: Xcode Beta6一直在倒数第二行给我一个错误,说“ DataModel.Type没有名为’myCalendar’的成员 尽管我认为这不会有所作为,但我尝试将myCalendar定义为var。 问题答案: 您无法初始化引用同一类的另一个实例属