为什么我不能从我用泛型创建的类中调用方法?爪哇

努诺·莫雷拉

我目前正在学习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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我不能从我用泛型创建的类中调用方法?爪哇

来自分类Dev

为什么我不能从泛型参数访问属性?

来自分类Dev

当对象是子类类型时,为什么我不能从超类调用子类中的公共方法?

来自分类Dev

为什么我不能从另一个类调用方法

来自分类Dev

Swift:为什么我不能从覆盖init调用方法?

来自分类Dev

我为什么不能从情节提要中创建IBAction

来自分类Dev

为什么我不能从事件侦听器调用方法,而不能在类中的其他地方调用方法?

来自分类Dev

为什么我不能在泛型类上静态引用内部类的静态方法?

来自分类Dev

为什么我不能从嵌入式UITableViewController调用存储在父UIViewController中的方法?

来自分类Dev

为什么我不能在Java中抛出或捕获泛型类的实例?

来自分类Dev

为什么不能从与委托方法相同的泛型定义的参数中推断出泛型?

来自分类Dev

我不能从类到窗体调用我的方法

来自分类Dev

为什么我不能从Angular调用ajax调用

来自分类Dev

为什么我们不能从派生类中调用受保护的析构函数?

来自分类Dev

为什么我不能从我的活动中调用此服务?

来自分类Dev

为什么我不能在 python 的类中调用我的方法?

来自分类Dev

为什么我不能从类外部访问 __init__ 中定义的类变量?

来自分类Dev

为什么我不能从类访问脚本变量?

来自分类Dev

为什么我不能从多个类继承?

来自分类Dev

为什么我不能从同一类C#中的方法访问公共字符串

来自分类Dev

为什么我不能调用基类的构造方法?

来自分类Dev

为什么我不能从图像阵列创建图像

来自分类Dev

为什么我不能使用Type变量作为泛型类的Type参数

来自分类Dev

为什么我不能从Google AppScript for Sheets的侧栏中调用服务器功能?

来自分类Dev

为什么我不能从CSS文件中获得CSS类智能感知?

来自分类Dev

为什么不能从扩展类型的基类中调用扩展方法?

来自分类Dev

为什么我不能在扩展通用特征的类中调用带有参数“ this”的方法?

来自分类Dev

为什么我不能在另一个类中调用静态方法?

来自分类Dev

为什么我不能从方法更改对象属性

Related 相关文章

  1. 1

    为什么我不能从我用泛型创建的类中调用方法?爪哇

  2. 2

    为什么我不能从泛型参数访问属性?

  3. 3

    当对象是子类类型时,为什么我不能从超类调用子类中的公共方法?

  4. 4

    为什么我不能从另一个类调用方法

  5. 5

    Swift:为什么我不能从覆盖init调用方法?

  6. 6

    我为什么不能从情节提要中创建IBAction

  7. 7

    为什么我不能从事件侦听器调用方法,而不能在类中的其他地方调用方法?

  8. 8

    为什么我不能在泛型类上静态引用内部类的静态方法?

  9. 9

    为什么我不能从嵌入式UITableViewController调用存储在父UIViewController中的方法?

  10. 10

    为什么我不能在Java中抛出或捕获泛型类的实例?

  11. 11

    为什么不能从与委托方法相同的泛型定义的参数中推断出泛型?

  12. 12

    我不能从类到窗体调用我的方法

  13. 13

    为什么我不能从Angular调用ajax调用

  14. 14

    为什么我们不能从派生类中调用受保护的析构函数?

  15. 15

    为什么我不能从我的活动中调用此服务?

  16. 16

    为什么我不能在 python 的类中调用我的方法?

  17. 17

    为什么我不能从类外部访问 __init__ 中定义的类变量?

  18. 18

    为什么我不能从类访问脚本变量?

  19. 19

    为什么我不能从多个类继承?

  20. 20

    为什么我不能从同一类C#中的方法访问公共字符串

  21. 21

    为什么我不能调用基类的构造方法?

  22. 22

    为什么我不能从图像阵列创建图像

  23. 23

    为什么我不能使用Type变量作为泛型类的Type参数

  24. 24

    为什么我不能从Google AppScript for Sheets的侧栏中调用服务器功能?

  25. 25

    为什么我不能从CSS文件中获得CSS类智能感知?

  26. 26

    为什么不能从扩展类型的基类中调用扩展方法?

  27. 27

    为什么我不能在扩展通用特征的类中调用带有参数“ this”的方法?

  28. 28

    为什么我不能在另一个类中调用静态方法?

  29. 29

    为什么我不能从方法更改对象属性

热门标签

归档