当使用完全限定类型时,类型注释会抛出“找不到符号”的错误

5
package com.company;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.List;

public class Main {

    @Target(ElementType.TYPE_USE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface A {}

    public static void main(String[] args) {
    }

    private List<@A Integer> integers1;

    private List<@A java.lang.Integer> integers2;
}

当我写下这段代码时:

private List<@A java.lang.Integer> integers2;

我遇到了一个错误:

Error:(20, 21) java: cannot find symbol symbol: class java
location: class com.company.Main

这是程序中的一个错误吗?


他们最近对注释进行了一些更改,我还没有完全弄清楚,但我认为这是“程序中的错误”。你不能在通用类型参数上使用注释。 - markspace
1
私有列表<@A Integer> integers1; 工作完美。 - user1222796
1
这个:https://bugs.openjdk.java.net/browse/JDK-8074346? - Jorn Vernee
非常相似的情况,但现在它在泛型参数声明中。 - user1222796
1个回答

5
这似乎是正常行为(9.7.4):

如果以下两个条件都成立,则可以使用类型注释:

  • 最接近注释的简单名称被归类为TypeName,而不是PackageName

  • 如果最接近注释的简单名称后面跟着"."和另一个TypeName,也就是说,注释显示为@Foo T.U,则U表示T的内部类。

换句话说,最接近@A的简单名称(java)是一个PackageName,因此该注释是不可接受的,并且会出现编译器错误。
在限定名称上使用类型注释的正确语法是java.lang.@A Integer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接