1
1
/*
2
- * Copyright 2002-2024 the original author or authors.
2
+ * Copyright 2002-2025 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
@@ -1189,10 +1189,11 @@ void isAssignableFromForComplexWildcards() throws Exception {
1189
1189
}
1190
1190
1191
1191
@ Test
1192
- void isAssignableFromForUnresolvedWildcards () {
1192
+ void isAssignableFromForUnresolvedWildcard () {
1193
1193
ResolvableType wildcard = ResolvableType .forInstance (new Wildcard <>());
1194
1194
ResolvableType wildcardFixed = ResolvableType .forInstance (new WildcardFixed ());
1195
- ResolvableType wildcardConcrete = ResolvableType .forClassWithGenerics (Wildcard .class , Number .class );
1195
+ ResolvableType wildcardConcrete = ResolvableType .forClassWithGenerics (Wildcard .class , CharSequence .class );
1196
+ ResolvableType wildcardConsumer = ResolvableType .forInstance (new WildcardConsumer <>());
1196
1197
1197
1198
assertThat (wildcard .isAssignableFrom (wildcardFixed )).isTrue ();
1198
1199
assertThat (wildcard .isAssignableFromResolvedPart (wildcardFixed )).isTrue ();
@@ -1206,6 +1207,38 @@ void isAssignableFromForUnresolvedWildcards() {
1206
1207
assertThat (wildcardConcrete .isAssignableFromResolvedPart (wildcard )).isTrue ();
1207
1208
assertThat (wildcardConcrete .isAssignableFrom (wildcardFixed )).isFalse ();
1208
1209
assertThat (wildcardConcrete .isAssignableFromResolvedPart (wildcardFixed )).isFalse ();
1210
+ assertThat (wildcardConsumer .as (Consumer .class ).getGeneric ().isAssignableFrom (wildcard )).isFalse ();
1211
+ assertThat (wildcardConsumer .as (Consumer .class ).getGeneric ().isAssignableFromResolvedPart (wildcard )).isTrue ();
1212
+ }
1213
+
1214
+ @ Test
1215
+ void isAssignableFromForUnresolvedDoubleWildcard () {
1216
+ ResolvableType wildcard = ResolvableType .forInstance (new DoubleWildcard <>());
1217
+ ResolvableType wildcardFixed = ResolvableType .forInstance (new DoubleWildcardFixed ());
1218
+ ResolvableType wildcardConsumer = ResolvableType .forInstance (new DoubleWildcardConsumer <>());
1219
+
1220
+ assertThat (wildcard .isAssignableFrom (wildcardFixed )).isTrue ();
1221
+ assertThat (wildcard .isAssignableFromResolvedPart (wildcardFixed )).isTrue ();
1222
+ assertThat (wildcardFixed .isAssignableFrom (wildcard )).isFalse ();
1223
+ assertThat (wildcardFixed .isAssignableFromResolvedPart (wildcard )).isFalse ();
1224
+ assertThat (wildcardConsumer .as (Consumer .class ).getGeneric ().isAssignableFrom (wildcard )).isTrue ();
1225
+ assertThat (wildcardConsumer .as (Consumer .class ).getGeneric ().isAssignableFromResolvedPart (wildcard )).isTrue ();
1226
+ }
1227
+
1228
+ @ Test
1229
+ void strictGenericsMatching () {
1230
+ ResolvableType consumerUnresolved = ResolvableType .forClass (Consumer .class );
1231
+ ResolvableType consumerObject = ResolvableType .forClassWithGenerics (Consumer .class , Object .class );
1232
+ ResolvableType consumerNestedUnresolved = ResolvableType .forClassWithGenerics (Consumer .class , ResolvableType .forClass (Consumer .class ));
1233
+
1234
+ assertThat (consumerUnresolved .isAssignableFrom (consumerObject )).isTrue ();
1235
+ assertThat (consumerUnresolved .isAssignableFromResolvedPart (consumerObject )).isTrue ();
1236
+ assertThat (consumerObject .isAssignableFrom (consumerUnresolved )).isTrue ();
1237
+ assertThat (consumerObject .isAssignableFromResolvedPart (consumerUnresolved )).isTrue ();
1238
+ assertThat (consumerUnresolved .isAssignableFrom (consumerNestedUnresolved )).isTrue ();
1239
+ assertThat (consumerUnresolved .isAssignableFromResolvedPart (consumerNestedUnresolved )).isTrue ();
1240
+ assertThat (consumerObject .isAssignableFrom (consumerNestedUnresolved )).isFalse ();
1241
+ assertThat (consumerObject .isAssignableFromResolvedPart (consumerNestedUnresolved )).isFalse ();
1209
1242
}
1210
1243
1211
1244
@ Test
@@ -1752,12 +1785,26 @@ public class MyCollectionSuperclassType extends MySuperclassType<Collection<Stri
1752
1785
}
1753
1786
1754
1787
1755
- public class Wildcard <T extends Number > {
1788
+ public class Wildcard <T extends CharSequence > {
1789
+ }
1790
+
1791
+ public class WildcardFixed extends Wildcard <String > {
1792
+ }
1793
+
1794
+ public class WildcardConsumer <T extends CharSequence & Serializable > implements Consumer <Wildcard <T >> {
1756
1795
}
1757
1796
1758
- public class WildcardFixed extends Wildcard <Integer > {
1797
+
1798
+ public class DoubleWildcard <T extends CharSequence & Serializable > {
1759
1799
}
1760
1800
1801
+ public class DoubleWildcardFixed extends DoubleWildcard <String > {
1802
+ }
1803
+
1804
+ public class DoubleWildcardConsumer <T extends CharSequence & Serializable > implements Consumer <DoubleWildcard <T >> {
1805
+ }
1806
+
1807
+
1761
1808
1762
1809
interface VariableNameSwitch <V , K > extends MultiValueMap <K , V > {
1763
1810
}
0 commit comments