从“注释”中,我认为您可以更改构建(?)的定义。您也没有指定是否ParameterDefinition
实际需要知道类型。如果没有,这将解决问题:
public static <X> ParameterDefinition<X> build(String name);
如果您只需要参数,因为Java有时会愚蠢地猜测泛型类型,但方法中没有使用它,您也可以这样做
public static <X> ParameterDefinition<X> build(Class<? super X> type, String name);
如果ParameterDefinition
使用 type 参数来确保值的类型,那么您应该知道没有可能的参数可以确保结果实际上是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
.
这就是我能想到的。如果您可以更具体地了解您的要求,那就太好了。