我目前正在学习java,遇到了一个我无法解决的泛型问题。
所以我有这门课:
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 原则的误解。总之,佩奇表示P roducer é xtends Ç onsumer小号UPER。
这意味着,如果参数化类型,即EntityRepository
产生与其参数类型相匹配的类型,即Entity
,您应该使用关键字extends
。通过产生我的意思是参数化类型的一种或多种方法的返回类型为泛型参数的类型的值。在您的示例中,在subMenu
方法中,如果EntityRepository
有一个方法返回of (这是其泛型类型参数)的后代Entity
,那么它将是一个生产者。
相反,如果一个参数化类型,即EntityRepository
消耗一个类型,它的参数,即类型相匹配Entity
,你应该使用关键字super
。通过消耗我的意思是参数化类型的一种或多种方法获得一个或多个参数,其类型为泛型参数的类型。在您的示例中,在subMenu
方法中,如果EntityRepository
有一个方法接受(是它的泛型类型参数)的后代(是的,后代!Entity
),那么它将是一个使用者。
现在,在该subMenu
方法中,您正在调用该EntityRepository.create
方法,该方法接收 anEntity
作为参数,因此,根据 PECS 原则,您的subMenu
方法的签名应该是:
public static void subMenu(EntityRepository<? super Entity> repository, String entidade)
这意味着,在该subMenu
方法的范围内,EntityRepository
是 的消费者Entity
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句