java - 为什么我不能从使用泛型创建的类中调用方法? java

标签 java generics

我目前正在学习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 方法的范围内,EntityRepositoryEntity 的使用者。

关于java - 为什么我不能从使用泛型创建的类中调用方法? java ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43903912/

相关文章:

java - 如何在两个类中使用一个变量?

java - 构造函数应该有 StoreStore 屏障吗?

java - 有没有办法知道java中的服务器文件目录结构?

generics - `my_func<T: MyTrait>` 与 `my_func<T> where T: MyTrait` 之间的区别

c# - 限制类型参数

java - 适用于比较器和比较器的通用

java - 调用对可能实现该接口(interface)的对象进行接口(interface)约束的泛型方法

java - 确定 ArrayList 是否有序的通用方法 (Java)

java - 尝试交换 Activity 时应用程序崩溃

Java 游戏 - 潜艇 killer - 只要按下向下键就发射炸弹