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) {