From 84a960f8a8a52bb4889010ebdb4dc335f8a7de92 Mon Sep 17 00:00:00 2001 From: Hanabi <317387557+Hanabi9248@users.noreply.github.com> Date: Wed, 28 Oct 2026 18:55:45 +0800 Subject: [PATCH] fix(common): handle classes without a superclass Compare from Number.class before the existing wrapper and primitive clauses. Genuine primitive, Object and interface Class values then evaluate instead of throwing NullPointerException. Cover ten JDK class inputs through the complete CommonUtil class. Keep the existing classification clauses and null-Class policy. Signed-off-by: Hanabi <317387557+Hanabi9248@users.noreply.github.com> --- .../com/highgo/cloud/util/CommonUtil.java | 2 +- .../CommonUtilClassPredicateRegression.java | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 tests/regression/CommonUtilClassPredicateRegression.java diff --git a/common/src/main/java/com/highgo/cloud/util/CommonUtil.java b/common/src/main/java/com/highgo/cloud/util/CommonUtil.java index 237f091..b668c0d 100644 --- a/common/src/main/java/com/highgo/cloud/util/CommonUtil.java +++ b/common/src/main/java/com/highgo/cloud/util/CommonUtil.java @@ -95,7 +95,7 @@ public static boolean isWrapClass(Class clz) { @SuppressWarnings("rawtypes") public static boolean isNumber(Class cls) { - return cls.getSuperclass().equals(Number.class) || CommonUtil.isWrapClass(cls) || cls.isPrimitive(); + return Number.class.equals(cls.getSuperclass()) || CommonUtil.isWrapClass(cls) || cls.isPrimitive(); } /** diff --git a/tests/regression/CommonUtilClassPredicateRegression.java b/tests/regression/CommonUtilClassPredicateRegression.java new file mode 100644 index 0000000..75dc59c --- /dev/null +++ b/tests/regression/CommonUtilClassPredicateRegression.java @@ -0,0 +1,39 @@ +import com.highgo.cloud.util.CommonUtil; + +/** Complete real class, genuine JDK Class values, no copied classifier or framework doubles. */ +public final class CommonUtilClassPredicateRegression { + private static int failures; + private static int cases; + + private static void expect(Class type, boolean expected) { + cases++; + try { + boolean actual = CommonUtil.isNumber(type); + if (actual != expected) { + throw new AssertionError(type + ": expected " + expected + ", got " + actual); + } + System.out.println("PASS " + type.getTypeName()); + } catch (Throwable error) { + failures++; + System.err.println("FAIL " + type.getTypeName() + ": " + error); + error.printStackTrace(System.err); + } + } + + public static void main(String[] args) { + expect(byte.class, true); + expect(short.class, true); + expect(int.class, true); + expect(long.class, true); + expect(float.class, true); + expect(double.class, true); + expect(Object.class, false); + expect(CharSequence.class, false); + expect(Integer.class, true); + expect(String.class, false); + if (failures != 0) { + throw new AssertionError(failures + " of " + cases + " cases failed"); + } + System.out.println(cases + " cases passed"); + } +}