Java 返回A<;列表<;Foo>&燃气轮机;来自建筑商

Java 返回A<;列表<;Foo>&燃气轮机;来自建筑商,java,generics,Java,Generics,在我的代码中,我希望使用如下类型的参数: public static final ParameterDefinition<List<String>> NAMES = ParameterDefinition.build( List.class, CURRENCY ); 如何摆脱@SuppressWarnings?如何在Java6中模拟List.class 注意:右侧的代码可能更复杂(即,build(List.class,String.class,“names”)就

在我的代码中,我希望使用如下类型的参数:

public static final ParameterDefinition<List<String>> NAMES
    = ParameterDefinition.build( List.class, CURRENCY );
如何摆脱
@SuppressWarnings
?如何在Java6中模拟
List.class


注意:右侧的代码可能更复杂(即,
build(List.class,String.class,“names”)
就可以了),但左侧必须完全相同。

参数定义是泛型类吗?换句话说,它是否定义为

public class ParameterDefinition<T>
如果是,则可以返回
参数定义
,如果不是,则需要决定在
区域中放置什么值

顺便说一下,将final添加到静态方法没有效果,而且是多余的。我会把它拿走

ParameterDefinition获取泛型参数后,可以编写

    public static final <X> ParameterDefinition<X> build(Class<X> clazz, String name) {
      ...
      return ...;
    }

一种方法可能是引入扩展类/接口的子类型,并定义具体的类型参数,例如
interface-StringList-extends-List
。在
build
方法中,您将能够获得已传递的类的泛型类型

然后,调用将如下所示:

public static final ParameterDefinition<? extends List<String>> NAMES = ParameterDefinition.build( StringList.class, CURRENCY  );

publicstaticfinalparameterdefinition如果您想使用
build(List.class,String.class,“names”)
,那么您可以使用
publicsclass ParameterDefinition
作为类定义,这样可以创建类
ParameterDefinition test=newparameterdefinition()

它并不漂亮,但应该可以工作,它允许您定义
列表所包含的内容。

从“注意”,我认为您可以更改build(?)的定义。 您也没有指定
参数定义
是否确实需要知道类型。 如果没有,这将实现以下功能:

public static <X> ParameterDefinition<X> build(String name);
这里的优点是
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");
公共接口参数验证器{
布尔接受(对象o)
}
公共静态ArgumentValidator实例(类类型){…}
公共静态ArgumentValidator listOf(类itemType){…}
公共静态参数定义生成(ArgumentValidator验证程序,字符串名称){…}
公共静态参数定义生成(类类型、字符串名称){
返回生成(instanceOf(type),name);
}
静态参数定义=构建(String.class,“name”);
静态参数定义=构建(listOf(String.class),“关键字”);
Protip:使用
org.hamcrest.Matcher
代替
ArgumentValidator


这就是我所能想到的。如果您能更具体地说明您的需求,那就太好了。

您的
构建方法是什么样子的?您的构建器返回类型是什么?我想我们缺少了这里的大部分相关代码。什么是
对象
参数定义.build()的签名是什么?那么
object.get()
呢?为什么特别要删除
@SuppressWarnings
?强制转换是有效的,并且由于类型擦除,参数化类在Java中根本不存在。如果唯一的目的是让开发人员更容易,那么看看Google Gson是如何用
TypeToken
解决这个问题的。
(ParameterDefinition) ParameterDefinition.build( List.class, "names" );
public static final ParameterDefinition<? extends List<String>> NAMES = ParameterDefinition.build( StringList.class, CURRENCY  );
public static <X> ParameterDefinition<X> build(String name);
public static <X> ParameterDefinition<X> build(Class<? super X> type, String name);
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");
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");