我目前正在学习java,遇到了一个无法解决的泛型问题。
所以我有这个类(class):
public class EntityRepository <Entidade extends Entity>{ "code" }
用这个方法:
public Long create(Entidade ent) {
ent.setId(this.nextId());
this.m1.put(ent.getId(), ent);
return ent.getId();
}
<小时/>
现在我在另一个类中有另一个方法,如下所示:
public static void subMenu(EntityRepository<? extends Entity> repository, String entidade)
其中包含以下代码:
Entity item = new Entity();
if(entidade.equals("produto")){
item = new Product();
}
else if(entidade.equals("prateleira")){
item = new Shelf();
}
repository.create(item);
repository.printList(entidade);
<小时/>
所以基本上,当字符串“entidade”等于字符串“produto”或“prateleira”时,应该从我上面提到的第一个类中调用“create”方法,但使用“Product”或“Shelf”作为参数。 (这是扩展到实体的对象)
我的问题是有这个错误:
“EntityRepository 类型中的方法 create(capture#1-of ? extends Entity) 不适用于参数 (Entity)”
我似乎无法理解为什么,也无法在网络上找到任何线索......
有人可以帮助我吗? 谢谢!
最佳答案
首先,您应该遵守有关泛型类型参数的命名约定,即它们应由单个大写字母组成。因此,让我们相应地更改您的代码:
public class EntityRepository<E extends Entity> {
// code
}
现在,您的问题是对 PECS principle 的误解。 。简而言之,PECS代表P生产商ExtendsC消费者S super 。
这意味着,如果参数化类型(即 EntityRepository
)生成与其参数类型(即 Entity
)匹配的类型,您应该使用关键字extends
。我所说的“产生”是指参数化类型的一个或多个方法返回一个值,该值的类型是泛型参数的类型。在您的示例中,在 subMenu
方法中,如果 EntityRepository
有一个返回 Entity
的后代的方法(其中是它的泛型类型参数),那么它将是一个生产者。
相反,如果参数化类型(即 EntityRepository
)使用与其参数类型(即 Entity
)相匹配的类型,则您应使用关键字super
。我所说的“消耗”是指参数化类型的一个或多个方法接收一个或多个其类型为泛型参数类型的参数。在您的示例中,在 subMenu
方法中,如果 EntityRepository
有一个接受 的后代(是的,后代!)的方法Entity
(这是它的泛型类型参数),那么它将是一个消费者。
现在,在 subMenu
方法中,您正在调用 EntityRepository.create
方法,该方法接收 Entity
作为参数,因此,根据 PECS 原则,您的 subMenu
方法的签名应该是:
public static void subMenu(EntityRepository<? super Entity> repository, String entidade)
这意味着,在 subMenu
方法的范围内,EntityRepository
是 Entity
的使用者。
关于java - 为什么我不能从使用泛型创建的类中调用方法? java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43903912/