理解内部泛型类

St.*_*rio 5 java generics

我写了以下代码:

public class Test<T> {

    public void method(){
        B b = new B();
    }

    public class B{ }
}

//Some method in some class contains the following lines    
Test<Integer> t = null;
Test.B b = t.new B(); //warning Test.B is a raw type
Run Code Online (Sandbox Code Playgroud)

为什么我收到这个警告?内部类型的declation B不包含类型参数,因此它不是泛型类型.此外,规范给出了以下内容:

如果一个类声明了一个或多个类型变量,则它是通用的

该类B未声明类型变量.那为什么它是通用类型?

And*_*mas 5

虽然内部类B没有声明任何类型变量,但它的实例隐式引用外部类的实例,这样做.

为什么我收到这个警告?

Test<Integer> t = null;
Test.B b = t.new B(); //warning Test.B is a raw type
Run Code Online (Sandbox Code Playgroud)

因为您使用原始类型声明了变量b.相反,您可以声明:

Test<Integer>.B b = t.new B(); // no warning!
Run Code Online (Sandbox Code Playgroud)


man*_*uti 3

我同意泛型类的规范没有清楚地涵盖您的场景。但原始类型的规范确实:

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

  • 通过采用泛型类型声明的名称而形成的引用类型,而无需附带类型参数列表。

  • 元素类型为原始类型的数组类型。

  • 原始类型 R 的非static成员类型,不是从 R 的超类或超接口继承的。

  • 顺便说一句,您提供的引用下面有一条注释: __Inner 成员的类型取决于 Outer 的类型参数。如果 Outer 是原始的,则 Inner 也必须被视为原始的,因为 T.__ 没有有效的绑定。他没有明确说明,`Test&lt;Integer&gt;.B` 是通用的 (3认同)