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 安裝目錄)。
添加回答
舉報
