为什么我不能用我用generics创建的类调用方法? java的

时间:2017-05-10 22:54:57

标签: java generics

我目前正在学习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);

所以基本上当String&#39; entidade&#39;等于字符串&#34; produto&#34;或者&#34; prateleira&#34;打电话给'创造&#39;我在上面提到的第一堂课的方法,但有一个&#39;产品&#39;或者一个架子&#39;作为参数。 (扩展到实体的对象)

我的问题是有这个错误:

&#34; EntityRepository类型中的create(捕获#1-of?extends Entity)方法不适用于参数(Entity)&#34;

我似乎无法理解为什么我也无法在网上找到任何线索...

有人能帮帮我吗? 谢谢!

2 个答案:

答案 0 :(得分:1)

首先,您应该坚持有关泛型类型参数的命名约定,它们声明它们应该由一个大写字母组成。因此,让我们相应地更改您的代码:

public class EntityRepository<E extends Entity> {
    // code
}

现在,您的问题包含对PECS principle的误解。简而言之, PECS 代表 P roducer E xtends C onsumer S uper。

这意味着如果参数化类型(即EntityRepository )生成与其参数类型匹配的类型,即Entity,则应使用关键字{{1 }}。通过产生我的意思是参数化类型的一个或多个方法返回一个值,其类型是泛型参数的类型。在您的示例中,在extends方法中,如果subMenu的方法返回EntityRepository后代(这是其泛型类型参数),那么将成为制片人。

相反,如果参数化类型(即Entity 使用类型与其参数类型匹配,即EntityRepository,则应使用关键字{{ 1}}。通过消耗我的意思是参数化类型的一个或多个方法接收一个或多个参数,其类型是泛型参数的类型。在您的示例中,在Entity方法中,如果super有一个方法接受subMenu后代(是的,后代!)(这是它的泛型类型参数),然后它将成为消费者。

现在,在EntityRepository方法中,您正在调用Entity方法,该方法接收subMenu作为参数,因此,根据PECS原则,您{的签名{1}}方法应该是:

EntityRepository.create

这意味着,在Entity方法的范围内,subMenupublic static void subMenu(EntityRepository<? super Entity> repository, String entidade) 的消费者。

答案 1 :(得分:0)

谢谢大家!问题得到了解决。这是我的错,因为我没有像我应该描述的那样。我是这个xD的新手

无论如何,谢谢!