"不兼容的类型"使用静态导入编译运行时参数注释时出错

时间:2014-10-14 19:29:27

标签: java annotations

使用以下注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface Param {
    String value();
}

和常数类:

public final class ExampleConstants {
    public static final String classConstant  = "classConstant";
    public static final String methodConstant = "methodConstant";
    public static final String paramConstant  = "paramConstant";
}

以下课程:

import com.example.annotations.Control;
import com.example.annotations.Param;
import com.example.annotations.Task;

import static com.example.ExampleConstants.*;

@Task(value = classConstant)
public class ExampleClass {
    @Control(methodConstant)
    public Object control(@Param(paramConstant) ExampleParam paramConstant) {
        return null;
    }
}

无法使用错误进行编译:

Error:(12, 34) java: incompatible types
  required: java.lang.String
  found:    com.example.ExampleParam

如果我将@Param注释声明更改为不使用静态导入,则按预期编译:

public Object control(@Param(ExampleConstants.paramConstant) ExampleResult paramConstant)

我正在寻求以下方面的澄清:

  • 为什么静态导入引用无法编译
  • 为什么编译错误会将“找到的类型”声明为方法参数类型
  • 为什么类引用import compile
  • 如何才能使静态导入工作(如果可能)

1 个答案:

答案 0 :(得分:2)

没有限制注释值不能进行静态和/或通配符导入。

错误表明该值属于ExampleParam类型 - 此处的问题是方法的参数与导入的常量具有相同的名称:paramConstant

ExampleConstants.paramConstant的示例中,值更具体,因此不再隐藏。

重命名参数,因此它不会再隐藏导入的值:

public Object control(@Param(paramConstant) ExampleParam exampleParam)