Skip to content

Commit aa79b53

Browse files
author
nicolaiparlog
committed
Use wildcards for transforming functions
1 parent 613468d commit aa79b53

File tree

10 files changed

+56
-94
lines changed

10 files changed

+56
-94
lines changed

src/main/java/org/codefx/libfx/collection/transform/AbstractTransformingIterator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public void forEachRemaining(Consumer<? super O> action) {
4848
/**
4949
* @return the wrapped/inner iterator
5050
*/
51-
protected abstract Iterator<I> getInnerIterator();
51+
protected abstract Iterator<? extends I> getInnerIterator();
5252

5353
/**
5454
* Transforms an element from the inner type {@code I} to the outer type {@code O}.

src/main/java/org/codefx/libfx/collection/transform/TransformingCollection.java

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,10 @@ public final class TransformingCollection<I, O> extends AbstractTransformingColl
3232
// #begin FIELDS
3333

3434
private final Collection<I> innerCollection;
35-
36-
private final Class<? super O> outerTypeToken;
37-
3835
private final Class<? super I> innerTypeToken;
39-
40-
private final Function<I, O> transformToOuter;
41-
42-
private final Function<O, I> transformToInner;
36+
private final Class<? super O> outerTypeToken;
37+
private final Function<? super I, ? extends O> transformToOuter;
38+
private final Function<? super O, ? extends I> transformToInner;
4339

4440
// #end FIELDS
4541

@@ -50,29 +46,29 @@ public final class TransformingCollection<I, O> extends AbstractTransformingColl
5046
* the wrapped collection
5147
* @param innerTypeToken
5248
* the token for the inner type
49+
* @param outerTypeToken
50+
* the token for the outer type
5351
* @param transformToOuter
5452
* transforms an element from an inner to an outer type; will never be called with null argument and must
5553
* not produce null
56-
* @param outerTypeToken
57-
* the token for the outer type
5854
* @param transformToInner
5955
* transforms an element from an outer to an inner type; will never be called with null argument and must
6056
* not produce null
6157
*/
62-
public TransformingCollection(
58+
TransformingCollection(
6359
Collection<I> innerCollection,
64-
Class<? super I> innerTypeToken, Function<I, O> transformToOuter,
65-
Class<? super O> outerTypeToken, Function<O, I> transformToInner) {
60+
Class<? super I> innerTypeToken, Class<? super O> outerTypeToken,
61+
Function<? super I, ? extends O> transformToOuter, Function<? super O, ? extends I> transformToInner) {
6662

6763
Objects.requireNonNull(innerCollection, "The argument 'innerCollection' must not be null.");
68-
Objects.requireNonNull(outerTypeToken, "The argument 'outerTypeToken' must not be null.");
6964
Objects.requireNonNull(innerTypeToken, "The argument 'innerTypeToken' must not be null.");
65+
Objects.requireNonNull(outerTypeToken, "The argument 'outerTypeToken' must not be null.");
7066
Objects.requireNonNull(transformToOuter, "The argument 'transformToOuter' must not be null.");
7167
Objects.requireNonNull(transformToInner, "The argument 'transformToInner' must not be null.");
7268

7369
this.innerCollection = innerCollection;
74-
this.outerTypeToken = outerTypeToken;
7570
this.innerTypeToken = innerTypeToken;
71+
this.outerTypeToken = outerTypeToken;
7672
this.transformToOuter = transformToOuter;
7773
this.transformToInner = transformToInner;
7874
}

src/main/java/org/codefx/libfx/collection/transform/TransformingIterator.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,8 @@
1818
*/
1919
public final class TransformingIterator<I, O> extends AbstractTransformingIterator<I, O> {
2020

21-
/**
22-
* The wrapped/inner iterator.
23-
*/
24-
private final Iterator<I> innerIterator;
25-
26-
/**
27-
* Function to transform elements from the inner type {@code I} to the outer type {@code O}.
28-
*/
29-
private final Function<I, O> transformToOuter;
21+
private final Iterator<? extends I> innerIterator;
22+
private final Function<? super I, ? extends O> transformToOuter;
3023

3124
/**
3225
* Creates a new iterator.
@@ -39,7 +32,8 @@ public final class TransformingIterator<I, O> extends AbstractTransformingIterat
3932
* @param transformToOuter
4033
* transforms elements from the inner type {@code I} to the outer type {@code O}
4134
*/
42-
public TransformingIterator(Iterator<I> innerIterator, Function<I, O> transformToOuter) {
35+
public TransformingIterator(
36+
Iterator<? extends I> innerIterator, Function<? super I, ? extends O> transformToOuter) {
4337
Objects.requireNonNull(innerIterator, "The argument 'innerIterator' must not be null.");
4438
Objects.requireNonNull(transformToOuter, "The argument 'transformToOuter' must not be null.");
4539

@@ -48,7 +42,7 @@ public TransformingIterator(Iterator<I> innerIterator, Function<I, O> transformT
4842
}
4943

5044
@Override
51-
protected Iterator<I> getInnerIterator() {
45+
protected Iterator<? extends I> getInnerIterator() {
5246
return innerIterator;
5347
}
5448

src/main/java/org/codefx/libfx/collection/transform/TransformingList.java

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,10 @@ public final class TransformingList<I, O> extends AbstractTransformingList<I, O>
3232
// #begin FIELDS
3333

3434
private final List<I> innerList;
35-
36-
private final Class<? super O> outerTypeToken;
37-
3835
private final Class<? super I> innerTypeToken;
39-
40-
private final Function<I, O> transformToOuter;
41-
42-
private final Function<O, I> transformToInner;
36+
private final Class<? super O> outerTypeToken;
37+
private final Function<? super I, ? extends O> transformToOuter;
38+
private final Function<? super O, ? extends I> transformToInner;
4339

4440
// #end FIELDS
4541

@@ -50,29 +46,29 @@ public final class TransformingList<I, O> extends AbstractTransformingList<I, O>
5046
* the wrapped list
5147
* @param innerTypeToken
5248
* the token for the inner type
49+
* @param outerTypeToken
50+
* the token for the outer type
5351
* @param transformToOuter
5452
* transforms an element from an inner to an outer type; will never be called with null argument and must
5553
* not produce null
56-
* @param outerTypeToken
57-
* the token for the outer type
5854
* @param transformToInner
5955
* transforms an element from an outer to an inner type; will never be called with null argument and must
6056
* not produce null
6157
*/
6258
public TransformingList(
6359
List<I> innerList,
64-
Class<? super I> innerTypeToken, Function<I, O> transformToOuter,
65-
Class<? super O> outerTypeToken, Function<O, I> transformToInner) {
60+
Class<? super I> innerTypeToken, Class<? super O> outerTypeToken,
61+
Function<? super I, ? extends O> transformToOuter, Function<? super O, ? extends I> transformToInner) {
6662

6763
Objects.requireNonNull(innerList, "The argument 'innerList' must not be null.");
68-
Objects.requireNonNull(outerTypeToken, "The argument 'outerTypeToken' must not be null.");
6964
Objects.requireNonNull(innerTypeToken, "The argument 'innerTypeToken' must not be null.");
65+
Objects.requireNonNull(outerTypeToken, "The argument 'outerTypeToken' must not be null.");
7066
Objects.requireNonNull(transformToOuter, "The argument 'transformToOuter' must not be null.");
7167
Objects.requireNonNull(transformToInner, "The argument 'transformToInner' must not be null.");
7268

7369
this.innerList = innerList;
74-
this.outerTypeToken = outerTypeToken;
7570
this.innerTypeToken = innerTypeToken;
71+
this.outerTypeToken = outerTypeToken;
7672
this.transformToOuter = transformToOuter;
7773
this.transformToInner = transformToInner;
7874
}

src/main/java/org/codefx/libfx/collection/transform/TransformingListIterator.java

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,9 @@
1919
*/
2020
public final class TransformingListIterator<I, O> extends AbstractTransformingListIterator<I, O> {
2121

22-
/**
23-
* The wrapped/inner list iterator.
24-
*/
2522
private final ListIterator<I> innerListIterator;
26-
27-
/**
28-
* Function to transform elements from the inner type {@code I} to the outer type {@code O}.
29-
*/
30-
private final Function<I, O> transformToOuter;
31-
32-
/**
33-
* Function to transform elements from the outer type {@code O} to the inner type {@code I}.
34-
*/
35-
private final Function<O, I> transformToInner;
23+
private final Function<? super I, ? extends O> transformToOuter;
24+
private final Function<? super O, ? extends I> transformToInner;
3625

3726
/**
3827
* Creates a new transforming list iterator.
@@ -48,7 +37,8 @@ public final class TransformingListIterator<I, O> extends AbstractTransformingLi
4837
* transforms elements from the outer type {@code O} to the inner type {@code I}
4938
*/
5039
public TransformingListIterator(
51-
ListIterator<I> innerListIterator, Function<I, O> transformToOuter, Function<O, I> transformToInner) {
40+
ListIterator<I> innerListIterator,
41+
Function<? super I, ? extends O> transformToOuter, Function<? super O, ? extends I> transformToInner) {
5242

5343
Objects.requireNonNull(innerListIterator, "The argument 'innerListIterator' must not be null.");
5444
Objects.requireNonNull(transformToOuter, "The argument 'transformToOuter' must not be null.");

src/main/java/org/codefx/libfx/collection/transform/TransformingSet.java

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,10 @@ public final class TransformingSet<I, O> extends AbstractTransformingSet<I, O> {
3232
// #begin FIELDS
3333

3434
private final Set<I> innerSet;
35-
3635
private final Class<? super O> outerTypeToken;
37-
3836
private final Class<? super I> innerTypeToken;
39-
40-
private final Function<I, O> transformToOuter;
41-
42-
private final Function<O, I> transformToInner;
37+
private final Function<? super I, ? extends O> transformToOuter;
38+
private final Function<? super O, ? extends I> transformToInner;
4339

4440
// #end FIELDS
4541

@@ -50,29 +46,29 @@ public final class TransformingSet<I, O> extends AbstractTransformingSet<I, O> {
5046
* the wrapped set
5147
* @param innerTypeToken
5248
* the token for the inner type
49+
* @param outerTypeToken
50+
* the token for the outer type
5351
* @param transformToOuter
5452
* transforms an element from an inner to an outer type; will never be called with null argument and must
5553
* not produce null
56-
* @param outerTypeToken
57-
* the token for the outer type
5854
* @param transformToInner
5955
* transforms an element from an outer to an inner type; will never be called with null argument and must
6056
* not produce null
6157
*/
62-
public TransformingSet(
58+
TransformingSet(
6359
Set<I> innerSet,
64-
Class<? super I> innerTypeToken, Function<I, O> transformToOuter,
65-
Class<? super O> outerTypeToken, Function<O, I> transformToInner) {
60+
Class<? super I> innerTypeToken, Class<? super O> outerTypeToken,
61+
Function<? super I, ? extends O> transformToOuter, Function<? super O, ? extends I> transformToInner) {
6662

6763
Objects.requireNonNull(innerSet, "The argument 'innerSet' must not be null.");
68-
Objects.requireNonNull(outerTypeToken, "The argument 'outerTypeToken' must not be null.");
6964
Objects.requireNonNull(innerTypeToken, "The argument 'innerTypeToken' must not be null.");
65+
Objects.requireNonNull(outerTypeToken, "The argument 'outerTypeToken' must not be null.");
7066
Objects.requireNonNull(transformToOuter, "The argument 'transformToOuter' must not be null.");
7167
Objects.requireNonNull(transformToInner, "The argument 'transformToInner' must not be null.");
7268

7369
this.innerSet = innerSet;
74-
this.outerTypeToken = outerTypeToken;
7570
this.innerTypeToken = innerTypeToken;
71+
this.outerTypeToken = outerTypeToken;
7672
this.transformToOuter = transformToOuter;
7773
this.transformToInner = transformToInner;
7874
}

src/main/java/org/codefx/libfx/collection/transform/TransformingSpliterator.java

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,9 @@
2424
*/
2525
public final class TransformingSpliterator<I, O> extends AbstractTransformingSpliterator<I, O> {
2626

27-
/**
28-
* The wrapped/inner spliterator.
29-
*/
3027
private final Spliterator<I> innerSpliterator;
31-
32-
/**
33-
* Function to transform elements from the inner type {@code I} to the outer type {@code O}.
34-
*/
35-
private final Function<I, O> transformToOuter;
36-
37-
/**
38-
* Function to transform elements from the outer type {@code O} to the inner type {@code I}.
39-
*/
40-
private final Function<O, I> transformToInner;
28+
private final Function<? super I, ? extends O> transformToOuter;
29+
private final Function<? super O, ? extends I> transformToInner;
4130

4231
/**
4332
* Creates a new transforming spliterator.
@@ -53,15 +42,16 @@ public final class TransformingSpliterator<I, O> extends AbstractTransformingSpl
5342
* transforms elements from the outer type {@code O} to the inner type {@code I}
5443
*/
5544
public TransformingSpliterator(
56-
Spliterator<I> innerSpliterator, Function<I, O> transformToOuter, Function<O, I> transformToInner) {
45+
Spliterator<I> innerSpliterator,
46+
Function<? super I, ? extends O> transformToOuter, Function<? super O, ? extends I> transformToInner) {
5747

5848
Objects.requireNonNull(innerSpliterator, "The argument 'innerSpliterator' must not be null.");
59-
Objects.requireNonNull(transformToOuter, "The argument 'transformToOuter' must not be null.");
6049
Objects.requireNonNull(transformToInner, "The argument 'transformToInner' must not be null.");
50+
Objects.requireNonNull(transformToOuter, "The argument 'transformToOuter' must not be null.");
6151

6252
this.innerSpliterator = innerSpliterator;
63-
this.transformToOuter = transformToOuter;
6453
this.transformToInner = transformToInner;
54+
this.transformToOuter = transformToOuter;
6555
}
6656

6757
@Override

src/test/java/org/codefx/libfx/collection/transform/TransformingCollectionTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ private static Collection<Feline> createBackedByMammal(Object[] felines) {
125125
* Because 'Feline' does not uphold the Liskov Substitution Principle (by having its own 'toString'
126126
* method) felines can not masquerade as mammals. Hence create a new mammal for each feline.
127127
*/
128-
Mammal.class, mammal -> new Feline(mammal.getName()),
129-
Feline.class, feline -> new Mammal(feline.getName()));
128+
Mammal.class, Feline.class,
129+
mammal -> new Feline(mammal.getName()), feline -> new Mammal(feline.getName()));
130130
}
131131

132132
private static Collection<Feline> createBackedByCat(Object[] felines) {
@@ -144,8 +144,8 @@ private static Collection<Feline> createBackedByCat(Object[] felines) {
144144
* Because 'Cat' does not uphold the Liskov Substitution Principle (by having its own 'toString'
145145
* method) cats can not masquerade as felines. Hence create a new feline for each cat.
146146
*/
147-
Cat.class, cat -> new Feline(cat.getName()),
148-
Feline.class, feline -> new Cat(feline.getName()));
147+
Cat.class, Feline.class,
148+
cat -> new Feline(cat.getName()), feline -> new Cat(feline.getName()));
149149
}
150150
}
151151

src/test/java/org/codefx/libfx/collection/transform/TransformingListTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@ private static List<Feline> createBackedByMammal(Object[] felines) {
128128
* Because 'Feline' does not uphold the Liskov Substitution Principle (by having its own 'toString'
129129
* method) felines can not masquerade as mammals. Hence create a new mammal for each feline.
130130
*/
131-
Mammal.class, mammal -> new Feline(mammal.getName()),
132-
Feline.class, feline -> new Mammal(feline.getName()));
131+
Mammal.class, Feline.class,
132+
mammal -> new Feline(mammal.getName()), feline -> new Mammal(feline.getName()));
133133
}
134134

135135
private static List<Feline> createBackedByCat(Object[] felines) {
@@ -147,8 +147,8 @@ private static List<Feline> createBackedByCat(Object[] felines) {
147147
* Because 'Cat' does not uphold the Liskov Substitution Principle (by having its own 'toString'
148148
* method) cats can not masquerade as felines. Hence create a new feline for each cat.
149149
*/
150-
Cat.class, cat -> new Feline(cat.getName()),
151-
Feline.class, feline -> new Cat(feline.getName()));
150+
Cat.class, Feline.class,
151+
cat -> new Feline(cat.getName()), feline -> new Cat(feline.getName()));
152152
}
153153
}
154154

src/test/java/org/codefx/libfx/collection/transform/TransformingSetTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,8 @@ private static Set<Feline> createBackedByMammalSet(Object[] felines) {
124124
* Because 'Feline' does not uphold the Liskov Substitution Principle (by having its own 'toString'
125125
* method) felines can not masquerade as mammals. Hence create a new mammal for each feline.
126126
*/
127-
Mammal.class, mammal -> new Feline(mammal.getName()),
128-
Feline.class, feline -> new Mammal(feline.getName()));
127+
Mammal.class, Feline.class,
128+
mammal -> new Feline(mammal.getName()), feline -> new Mammal(feline.getName()));
129129
}
130130

131131
private static Set<Feline> createBackedByCatSet(Object[] felines) {
@@ -143,8 +143,8 @@ private static Set<Feline> createBackedByCatSet(Object[] felines) {
143143
* Because 'Cat' does not uphold the Liskov Substitution Principle (by having its own 'toString'
144144
* method) cats can not masquerade as felines. Hence create a new feline for each cat.
145145
*/
146-
Cat.class, cat -> new Feline(cat.getName()),
147-
Feline.class, feline -> new Cat(feline.getName()));
146+
Cat.class, Feline.class,
147+
cat -> new Feline(cat.getName()), feline -> new Cat(feline.getName()));
148148
}
149149
}
150150

0 commit comments

Comments
 (0)