在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方法让我混淆使用泛型,我不知道如何使这个方法工作或返回一些有用的东西。
答案 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... */
}
}