Java泛型-方法参数和方法返回类型的编译错误

Java泛型-方法参数和方法返回类型的编译错误,java,generics,Java,Generics,假设我有两个接口: public interface IObjectOne<T> { List<T> digest(final List<T> myList); } public interface IObjectTwo<T> { List<T> create(); } 为什么我不能那样做 entity.getObjectOne().digest(entity.getObjectTwo().create()); 在

假设我有两个接口:

public interface IObjectOne<T>
{
    List<T> digest(final List<T> myList);
}

public interface IObjectTwo<T>
{
    List<T> create();
}
为什么我不能那样做

entity.getObjectOne().digest(entity.getObjectTwo().create());
在这里:

final Entity=entities.get(键);
你的意思是:你绝对不关心实体的确切类型。提醒:通配符的意思是“我不知道”确切的类型

以及对泛型使用通配符的一个结果,如下所述:

如果要对不同类型的方法参数强制执行某种关系,则不能使用通配符,必须使用类型参数

换句话说:通过像这样使用通配符,编译器无法关联泛型类型

这里:

final Entity=entities.get(键);
你的意思是:你绝对不关心实体的确切类型。提醒:通配符的意思是“我不知道”确切的类型

以及对泛型使用通配符的一个结果,如下所述:

如果要对不同类型的方法参数强制执行某种关系,则不能使用通配符,必须使用类型参数


换句话说:通过像这样使用通配符,编译器无法关联泛型类型

您如何创建
地图

您应该参数化
实体
,因为它是泛型的

Map<String, Entity<YOUR_TYPE>> entities = new HashMap<>();
final Entity<YourType> entity = entities.get(key);
Map entities=newhashmap();
最终实体=entities.get(键);

您如何创建
地图

您应该参数化
实体
,因为它是泛型的

Map<String, Entity<YOUR_TYPE>> entities = new HashMap<>();
final Entity<YourType> entity = entities.get(key);
Map entities=newhashmap();
最终实体=entities.get(键);

要执行此操作,您需要在带有类型变量的方法中执行操作:

<T> void doSomething(Entity<T> entity) {
  entity.getObjectOne().digest(entity.getObjectTwo().create());
}
void doSomething(实体){
entity.getObjectOne().digest(entity.getObjectTwo().create());
}
即使对于
实体
,您也可以调用它,因为该通配符有某种类型,您只是不知道它

final Entity<?> entity = entities.get(key);
doSomething(entity);
final Entity=entities.get(键);
doSomething(实体);

要执行此操作,您需要在带有类型变量的方法中执行操作:

<T> void doSomething(Entity<T> entity) {
  entity.getObjectOne().digest(entity.getObjectTwo().create());
}
void doSomething(实体){
entity.getObjectOne().digest(entity.getObjectTwo().create());
}
即使对于
实体
,您也可以调用它,因为该通配符有某种类型,您只是不知道它

final Entity<?> entity = entities.get(key);
doSomething(entity);
final Entity=entities.get(键);
doSomething(实体);

既然我不知道实体管理的类型是什么,我怎么能不使用?通配符?通配符的意思是:“我不知道”。它不是说“我不在乎”:它的意思是“我不知道”,通常你也不在乎。您只关心是否正在执行类似OP的操作:将生产者方法的结果传递到消费者方法。请重新编写。因为我不知道实体管理的类型是什么,我怎么能不使用?通配符?通配符的意思是:“我不知道”。它不是说“我不在乎”:它的意思是“我不知道”,通常你也不在乎。你只关心你是否在做类似于OP的事情:将生产者方法的结果传递给消费者方法。重新编写。用与你非常相似的示例回答:用与你非常相似的示例回答:是的,我发现IBM()的一篇很好的文章讲述了完全相同的事情。我真的觉得这是一个糟糕的编码。这意味着一个重复的digest()方法是的,我发现IBM()的一篇很好的文章讲述了完全相同的事情。我真的觉得这是一个糟糕的编码。这意味着一个重复的digest()方法