「注意事項」より、build(?)の定義を変更できると思います。ParameterDefinition
が実際に型を知る必要があるかどうかも指定しませんでした。そうでない場合は、これでうまくいきます。
public static <X> ParameterDefinition<X> build(String name);
Javaがジェネリック型を推測するのがばかげているという理由だけでパラメーターが必要であるが、メソッドで使用されていない場合は、次のこともできます
public static <X> ParameterDefinition<X> build(Class<? super X> type, String name);
が型パラメーターを使用して値の型を保証する場合ParameterDefinition
、結果が実際に であることを保証する引数は存在しないことに注意してくださいList<String>
。それがおそらく、問題に対する簡単な解決策がない理由です。
気にしない場合は、次のことができます。
public static <X> ParameterDefinition<X> build(Class<X> type, String name) { ... }
@SuppressWarnings({"unchecked", "rawtypes"})
public static <X> Class<List<X>> listOf(Class<X> itemType) {
return (Class) List.class;
}
static ParameterDefinition<String> = build(String.class, "name");
static ParameterDefinition<List<String>> = build(listOf(String.class), "keywords");
ここでの利点は、これらSuppressWarnings
がライブラリ コードにあり、API ユーザーがそれらに対処する必要がないことです。
リストのすべての要素が文字列であることが実際に重要であり、実装が拡張可能であると想定している場合は、より複雑なアプローチが必要になります。
public interface ArgumentValidator<X> {
boolean accept(Object o)
}
public static <X> ArgumentValidator<X> instanceOf(Class<X> type) { ... }
public static <X> ArgumentValidator<List<X>> listOf(Class<X> itemType) { ... }
public static <X> ParameterDefinition<X> build(ArgumentValidator<X> validator, String name) { ... }
public static <X> ParameterDefinition<X> build(Class<X> type, String name) {
return build(instanceOf(type), name);
}
static ParameterDefinition<String> = build(String.class, "name");
static ParameterDefinition<List<String>> = build(listOf(String.class), "keywords");
アドバイス: の代わりにArgumentValidator
を使用してorg.hamcrest.Matcher
ください。
それは私が考えることができるすべてです。要件についてもう少し具体的に説明していただければ幸いです。