了解泛型方法返回类型

时间:2018-05-10 16:50:22

标签: java jpa generics

public interface Path<X> extends Expression<X>中有一种方法:

<Y> Path<Y> get(String attributeName);

我不明白这种通用方法是如何工作的。在参数列表中,没有定义泛型但是如何确认返回类型?

我的实验如下:

class abc<Y> implements myinterfa<Y> {
    Y ab;

    public <Y> Y get(String attributeName) {
        return ab;
    }
}

它无法在编译时工作。

错误消息是:

  

不兼容的类型。
  要求:
  ÿ
  实测:
  ÿ

PS ------------

  @Override
    public List<WebSite> list(WebSite webSite, Integer page, Integer pageSize) {
        Pageable pageable = new PageRequest(page, pageSize, Sort.Direction.ASC, "id");
        Page<WebSite> pageWebSite = webSiteRepository.findAll(new Specification<WebSite>() {

            @Override
            public Predicate toPredicate(Root<WebSite> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                Predicate predicate = cb.conjunction();
                if (webSite != null) {
                    if (StringUtil.isNotEmpty(webSite.getName())) {
                        predicate.getExpressions().add(cb.like(root.get("name"), "%" + webSite.getName().trim() + "%"));
                    }
                    if (StringUtil.isNotEmpty(webSite.getUrl())) {
                        predicate.getExpressions().add(cb.like(root.get("url"), "%" + webSite.getUrl().trim() + "%"));
                    }
                }
                return predicate;
            }
        }, pageable);
        return pageWebSite.getContent();
    }

这个方法在我的BLL中,我的存储库是:

public interface WebSiteRepository extends JpaRepository<WebSite, Integer>, JpaSpecificationExecutor<WebSite> {

}

我跟随调用链到Path接口:

public interface Path<X> extends Expression<X> {
    <Y> Path<Y> get(String attributeName);
}

已经调用了泛型方法,但我不知道这种方法是如何工作的。

PS2 ----------

让我澄清一下这个问题:

接口Path的get方法如何确认Y标识符?接口和方法没有使用相同的Identifier.I无法使用 Path<String> path = new subClass<String>() 确认参数类型。 并且在参数签名中没有定义通用参数类型,如:

<Y> Path<Y> get(Y attributeName);

在这种格式中,我可以用以下方法调用方法:

String result = path.get("vincent");

因为当我通过&#34; vincent&#34;对于此方法,标识符Y已确认。

get方法让我混淆使用泛型,我不知道如何使这个方法工作或返回一些有用的东西。

1 个答案:

答案 0 :(得分:3)

您将该类声明为通用的方法,但两者都使用Y作为type参数的标识符。您需要从<Y>方法中移除get,一切都会好的:

class abc<Y> implements myinterfa<Y> {
    Y ab;

    public Y get(String attributeName) {
        return ab;
    }
}

get方法可以独立于类而变得通用(尽管在你的情况下 - 实际上大多数情况下 - 它没有意义)但你需要选择一个不同的标识符:

class abc<Y> implements myinterfa<Y> {
    public <T> T get(String attributeName) {
        return null; /* or something useful... */
    }
}