Java 循环中的泛型,试图避免强制转换

Java 循环中的泛型,试图避免强制转换,java,generics,Java,Generics,我在一个循环中有一个方法调用,当前该循环未编译: for (Example example : Util.getExample(List.class)) { // Do something with example } Util: 这是我目前面临的问题,因此,我问为什么要避免演员阵容。我不希望强制转换,因为我希望生成一些代码来访问类型并在过程中尊重Java泛型。如果您的getExample方法应该总是返回列表,那么是的,将其返回类型更改为list。但是,由于您要将List.class作

我在一个循环中有一个方法调用,当前该循环未编译:

for (Example example : Util.getExample(List.class)) {
    // Do something with example
}
Util:


这是我目前面临的问题,因此,我问为什么要避免演员阵容。我不希望强制转换,因为我希望生成一些代码来访问类型并在过程中尊重Java泛型。

如果您的
getExample
方法应该总是返回列表,那么是的,将其返回类型更改为
list
。但是,由于您要将
List.class
作为参数传递,因此似乎需要一个方法,该方法可以根据传递的类对象返回列表和非列表

如果是这样,那就不会像你希望的那样。在本例中,您的方法只返回原始类型
List
。要使它返回
List
,您必须传递类似于假设的
List.class
,但没有这样的东西。泛型类型参数在编译时被删除,因此
List
List
实际上是同一个类;它们没有单独的类对象,因此类对象参数不能告诉方法它应该返回什么类型的列表


您可能需要尝试不同的设计方法。由于这显然是一个简化的示例,如果您发布更多关于您实际要完成的任务的详细信息,您可能会获得更多帮助。

Guava的
TypeToken
可以用于本例,因为
List.class
无效。TypeToken用于创建匿名类。因为匿名类保留它们的泛型签名,所以这是可行的

for (Example foo : Util.getExample(new TypeToken<List<Example>>() {}) {
    // do stuff
} 

// utils
public <T> T getExample(TypeToken<T> typeToken) {
    Type type = typeToken.getType();
    // get example
}
for(例如foo:Util.getExample(newTypeToken(){}){
//做事
} 
//乌提尔斯
public T getExample(TypeToken TypeToken){
Type Type=typeToken.getType();
//以身作则
}

TypeToken比只使用类更具体。您也可以使用普通的
类型作为参数,这样您仍然可以为它提供一个类。Gson就是这样做的。

我认为这是一个设计问题

由于您正在调用的
Util
中的方法被称为
getExamples
,因此,最好将其修复为返回一些集合,这些集合的元素是
Example
类的实例

getExamples
更改为类似以下内容是合理的:

class Util {

  public static <C extends Collection<? supper Example>> getExamples(final Supplier<C> factory) {
       final C result = factory.get();
       // here goes the code that adds the examples to the result collection
       // using add or addAll.
       return result;
  } 

}
class-Util{

公共静态我理解这个问题,你可以用番石榴的
TypeToken
这样做,因为你可以传递一个
TypeToken
,而不是
List.class
,它是一个
class
。啊,好主意@Radiodef,我会试试这个。我有一种感觉,这会涉及到序列化。泛型pe检查发生在编译时,序列化发生在运行时,因此它们根本不在一起。如果您只想将其写入字节,您真的需要编译时类型安全的
List
吗?类似于
ListRight,Parceler是一个注释处理器(在编译时运行)这将生成一个可在运行时使用的包裹。列表已处理,但会遇到相同的问题。你说得对@Wyzard,我已简化了我的问题。在尝试一些完全不同的方法之前,我真的尝试头脑风暴解决此问题。我已用更多信息更新了问题。我希望这足够支持rt我面临的问题。我希望我可以。我使用此实用程序返回的不仅仅是集合。@John Ericksen,这取决于您如何将这些示例实例存储在Util中,那么您也可以使用java streams来完成整个任务。我想也许您应该提供更多关于实际代码的详细信息。@John Ericksen,我只能添加请回答已发布的问题。我已用更多信息更新了问题。我希望这足够支持我面临的问题。
for (Example foo : Util.getExample(new TypeToken<List<Example>>() {}) {
    // do stuff
} 

// utils
public <T> T getExample(TypeToken<T> typeToken) {
    Type type = typeToken.getType();
    // get example
}
class Util {

  public static <C extends Collection<? supper Example>> getExamples(final Supplier<C> factory) {
       final C result = factory.get();
       // here goes the code that adds the examples to the result collection
       // using add or addAll.
       return result;
  } 

}
List<Example> examples = Util.getExamples(ArrayList<Example>::new);