3 回答
TA贡献1828条经验 获得超6个赞
为了构建项目,请使用完全限定名称来实现定义的静态嵌套类的接口com.vinaysshenoy.types.util.Util:
public static final class ParameterizedTypeImpl implements java.lang.reflect.ParameterizedType { ... }
public static final class GenericArrayTypeImpl implements java.lang.reflect.GenericArrayType { ... }
public static final class WildcardTypeImpl implements java.lang.reflect.WildcardType { ... }
此外,如果您不想使用完全限定名称,则只需将静态嵌套类提取到顶层即可。
笔记:
当使用JDK编译器时,项目编译没有错误:
javac -cp path_to_jsr305-3.0.2.jar -d bin src/main/java/com/vinaysshenoy/types/Types.java src/main/java/com/vinaysshenoy/types/util/Util.java
这个问题似乎与平台有关。我尝试在 Windows 10/Oracle JDK 1.8.0_111 上构建项目 - 没有发现任何问题。但是,该问题完全按照 Ubuntu 16.04/Oracle JDK 1.8.0_201 和 Ubuntu 16.04/OpenJDK 1.8.0_191 上的描述重现。
TA贡献1830条经验 获得超9个赞
解决方案
@Zgurskyi 的回答是一个很好的解决方法,但是,我相信它只能解决实际问题的症状(见下文)。这是解决根本问题的另一种恕我直言的更清洁方法:导入com.vinaysshenoy.types.util.Utilfrom com.vinaysshenoy.types.Types non-static的嵌套类型:
diff --git a/src/main/java/com/vinaysshenoy/types/Types.java b/src/main/java/com/vinaysshenoy/types/Types.java
index e3a44d8..92ac237 100644
--- a/src/main/java/com/vinaysshenoy/types/Types.java
+++ b/src/main/java/com/vinaysshenoy/types/Types.java
@@ -17,9 +17,9 @@ package com.vinaysshenoy.types;
import static com.vinaysshenoy.types.util.Util.EMPTY_TYPE_ARRAY;
-import static com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl;
-import static com.vinaysshenoy.types.util.Util.ParameterizedTypeImpl;
-import static com.vinaysshenoy.types.util.Util.WildcardTypeImpl;
+import com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl;
+import com.vinaysshenoy.types.util.Util.ParameterizedTypeImpl;
+import com.vinaysshenoy.types.util.Util.WildcardTypeImpl;
import static com.vinaysshenoy.types.util.Util.getGenericSupertype;
import static com.vinaysshenoy.types.util.Util.resolve;
(顺便说一句,除了@Zgurskyi,我还可以通过手动javac调用来重现它。我只安装了一个JDK;也许命令行上的@Zgurskyijavac不是来自Gradle 使用的同一个JDK。)
实际问题
您静态导入嵌套类(不仅仅是类成员),尽管这永远不是必需的。我实际上很惊讶这似乎通常有效,但显然一些 Java 编译器在某些情况下至少会窒息它。
在您的情况下,Gradle 使用的 Java 编译器在以下情况下无法正确解析导入(只是对编译器所做工作的粗略、不是非常技术性的描述):
在处理 时
com.vinaysshenoy.types.util.Util
,编译器会找到 的静态导入com.vinaysshenoy.types.Types.arrayOf
,因此编译器会查看com.vinaysshenoy.types.Types
该类。com.vinaysshenoy.types.Types
具有 的静态导入com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl
,因此编译器会查看嵌套GenericArrayTypeImpl
类。com.vinaysshenoy.types.util.Util.GenericArrayTypeImpl
使用 (java.lang.reflect.
)GenericArrayType
,但是,此时尚未处理该类型的导入,这会导致“找不到符号”错误。
可以说,它也可以被认为是一个 JDK 错误,它适用于某些编译器,但不适用于其他编译器。
TA贡献1827条经验 获得超8个赞
我检查了您的项目,并且可以使用gradlew clean build
.
我假设gradle 找不到 JDK 安装,因为
未安装 JDK(IDE 通常带有自己的捆绑安装),或者
环境变量未正确设置(设置并将其
JAVA_HOME
指向您的 JDK 安装目录)。
添加回答
举报