From c3eaec262672a0cb54b73259c9f2b1c9db1aa857 Mon Sep 17 00:00:00 2001 From: aston Date: Fri, 1 Mar 2024 09:58:19 +0200 Subject: [PATCH] #91: Fix constructor matching ParameterizedType issue --- .../NativeInstantiationImpl.java | 23 ++++++++++++++---- ...-0.18.0-SNAPSHOT-jar-with-dependencies.jar | Bin 2288811 -> 2289078 bytes 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/java/src/main/java/org/astonbitecode/j4rs/api/instantiation/NativeInstantiationImpl.java b/java/src/main/java/org/astonbitecode/j4rs/api/instantiation/NativeInstantiationImpl.java index a160dd3..831f688 100644 --- a/java/src/main/java/org/astonbitecode/j4rs/api/instantiation/NativeInstantiationImpl.java +++ b/java/src/main/java/org/astonbitecode/j4rs/api/instantiation/NativeInstantiationImpl.java @@ -116,17 +116,30 @@ private static Constructor findConstructor(Class clazz, Class[] argTypes) thr // Check each parameter type Type typ = pts[i]; - if (typ instanceof ParameterizedType || typ instanceof WildcardType) { - // For generic parameters, the type erasure makes the parameter be an - // Object.class - // Therefore, the argument is always matched - matchedParams.add(true); + if (typ instanceof ParameterizedType) { + // The arg matches via the equals method. Eg. List + Type t = ((ParameterizedType)typ).getRawType(); + matchedParams.add(((Class)t).isAssignableFrom(argTypes[i])); } else if (typ instanceof GenericArrayType) { // TODO: Improve by checking the actual types of the arrays? matchedParams.add(argTypes[i].isArray()); } else if (typ instanceof Class) { // In case of TypeVariable, the arg matches via the equals method matchedParams.add(((Class) typ).isAssignableFrom(argTypes[i])); + } else if (typ instanceof WildcardType) { + // Find the type and match. Eg. ? ? extends String etc + WildcardType wildcardType = (WildcardType) typ; + Type t = null; + Type[] upperBounds = wildcardType.getUpperBounds(); + if (upperBounds != null && upperBounds.length > 0 && !Object.class.equals(upperBounds[0])) { + t = upperBounds[0]; + } else { + Type[] lowerBounds = wildcardType.getLowerBounds(); + if (lowerBounds != null && lowerBounds.length > 0 && !Object.class.equals(lowerBounds[0])) { + t = lowerBounds[0]; + } + } + matchedParams.add(((Class)t).isAssignableFrom(argTypes[i])); } else { // We get to this point if the TypeVariable is a generic, which is defined with // a name like T, U etc. diff --git a/rust/jassets/j4rs-0.18.0-SNAPSHOT-jar-with-dependencies.jar b/rust/jassets/j4rs-0.18.0-SNAPSHOT-jar-with-dependencies.jar index 734f82a20b813053bcf3bc151ae46a09ea7a2817..f17475ef59e399f5348828bc8cd2907b5e7abdad 100644 GIT binary patch delta 8453 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