transform
一般的なワイルドカード間に関係を課す方法がないため、実装に必要な制約を強制する方法はありません。宣言?
内の 2 つのそれぞれは、それぞれが未知の型を意味する運命にあり、それらを互いにバインドする方法はありません。SetToListTransformer
他の人が指摘したように、最も簡単な解決策はSetToListTransformer
ジェネリックにすることです。例えば:
class SetToListTransformer<T> implements Transformer<Set<? extends T>, List<T>> {
@Override
public List<T> transform(final Set<? extends T> input) {
final List<T> output = new ArrayList<T>(input.size());
output.addAll(input);
return output;
}
}
もちろん、これには特定の型引数でトランスフォーマーをインスタンス化する必要があります。SetToListTransformer
安ければこれでいいのです。ただし、1 つのインスタンスのみを使用することを示しました。その方法は次のとおりです。
class MyTransformers {
// There is no reason to expose SetToListTransformer now.
// Keep it here as an anonymous class.
private static final Transformer<Set<?>, List<?>> FROM_SET_TO_LIST =
new Transformer<Set<?>, List<?>>() {
@Override
public List<?> transform(final Set<?> input) {
return doTransform(input);
}
private <T> List<T> doTransform(final Set<T> input) {
final List<T> output = new ArrayList<T>(input.size());
output.addAll(input);
return output;
}
};
private MyTransformers() { }
public static <T> Transformer<Set<? extends T>, List<T>> fromSetToList() {
@SuppressWarnings("unchecked")//this is okay for any T because the impl is stateless
final Transformer<Set<? extends T>, List<T>> withNarrowedTypes =
(Transformer<Set<? extends T>, List<T>>)(Transformer<?, ?>)FROM_SET_TO_LIST;
return withNarrowedTypes;
}
}
使用例を次に示します。
Set<Integer> intSet = new HashSet<Integer>();
intSet.add(42);
intSet.add(1337);
List<Number> numList = MyTransformers.<Number>fromSetToList().transform(intSet);