From 50e41dba25149f3a4c6fb2a9cb85deee74976cb6 Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Sun, 19 Jul 2020 21:36:19 +0800 Subject: [PATCH] --- src/org/redkale/util/TypeToken.java | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/org/redkale/util/TypeToken.java b/src/org/redkale/util/TypeToken.java index 6b7167c12..79c87fe9e 100644 --- a/src/org/redkale/util/TypeToken.java +++ b/src/org/redkale/util/TypeToken.java @@ -153,7 +153,33 @@ public abstract class TypeToken { } if (atas.length == asts.length) { for (int i = 0; i < asts.length; i++) { - if (asts[i] == type) { + Type currt = asts[i]; + if (asts[i] != type && superPT.getRawType() instanceof Class) { + if (asts[i] instanceof TypeVariable) { + + Class raw = (Class) superPT.getRawType(); + do { + Type rawsuper = raw.getGenericSuperclass(); + if (!(rawsuper instanceof ParameterizedType)) break; + ParameterizedType rpt = (ParameterizedType) rawsuper; + Type supraw = rpt.getRawType(); + if (!(supraw instanceof Class)) break; + Type[] tps = ((Class) supraw).getTypeParameters(); + if (rpt.getActualTypeArguments().length == tps.length) { + for (int k = 0; k < rpt.getActualTypeArguments().length; k++) { + if (rpt.getActualTypeArguments()[k] == currt) { + currt = tps[k]; + break; + } + } + } + Type rtrt = rpt.getRawType(); + if (!(rtrt instanceof Class)) break; + raw = (Class) rtrt; + } while (raw != Object.class); + } + } + if (currt == type) { if (atas[i] instanceof Class && ((TypeVariable) type).getBounds().length == 1 && ((TypeVariable) type).getBounds()[0] instanceof Class