Java 如何像泛型类一样返回扩展类?
我有三个类Java 如何像泛型类一样返回扩展类?,java,generics,inheritance,Java,Generics,Inheritance,我有三个类AdminAccount,CustomerAccount,糖果帐户,它们是从帐户扩展而来的。在方法findByUsername(stringusername)中,我想检查这三个类并返回一个不为NULL的类 public <R extends Account> R findByUsername(String username) { AdminAccount adminAccount = adminAccountDao.findByUsername(us
AdminAccount
,CustomerAccount
,糖果帐户
,它们是从帐户
扩展而来的。在方法findByUsername(stringusername)
中,我想检查这三个类并返回一个不为NULL的类
public <R extends Account> R findByUsername(String username) {
AdminAccount adminAccount = adminAccountDao.findByUsername(username).orElse(null);
CustomerAccount customerAccount = customerAccountDao.findByUsername(username).orElse(null);
ConfectionerAccount confectionerAccount = confectionerAccountDao.findByUsername(username).orElse(null);
return Stream.of(adminAccount, customerAccount, confectionerAccount).filter(Objects::nonNull).findFirst().get();
}
请你解释一下,我的错在哪里?如何返回具体的类,如
AdminAccount
、CustomerAccount
或CandictionerAccount
?这是对泛型的滥用。泛型类型参数是由调用者而不是被调用者确定的,因此,findByUsername
不能根据这些帐户中的哪一个为空来决定什么是R
。调用方应该能够决定R
是什么,即我可以做:
class Foo extends Account {}
...
Foo foo = findByUsername("Sweeper");
你必须能给我一个Foo
显然,findByUsername
无法做到这一点,因此它不应该是泛型的
您只需在此处返回帐户
:
public Account findByUsername(String username) {
现在,调用方无法从findByUsername
中选择它想要的帐户类型,这是完全有意义的,因为调用方通常无法“看到”findByUsername的工作方式,也无法计算出它将为给定用户名返回什么类型的帐户
public Account findByUsername(String username) {