Java抽象类获取扩展类的类型

标签 java

我不知道怎么表达这个,所以我举个例子

class AbstractUser<A extends AbstractAccount<? extends AbstractType>> {
    // I want a method that has access to Type
    // And returns the specific Type that extends AbstractType
    protected <T extends AbstractType> T doSomething(T type) {
        // do stuff
        // and return the type specific type T
    }
}

class AbstractAccount<T extends AbstractType> {

}

class AbstractType {

}


class Type extends AbstractType {

}

class Account extends AbstractAccount<Type> {

}

class AccountAdmin extends AbstractAccount<Type> {

}

class User extends AbstractUser<Account> {

}

我想要的是在 User 类中我可以执行 getType() 并返回 AbstractAccount 的特定类型,在本例中为 Account

如何在不指定更多模板的情况下执行此操作?换句话说,我想要任何类型的 ? in ? extends AbstractType 就是在那个方法里

如果我这样做

final Account account = ...
final AccountAdmin admin = ...
final User user = ...
user.doSomething(account); // should work
user.doSomething(AccountAdmin); // should fail

最佳答案

你显然不能像这样在 AbstractUser 中创建方法:

public Class<A> getType() { return A.class; }

这是因为类型删除。运行时不知道 A 是什么。

因此,一种解决方法是将此方法抽象化:

public abstract Class<A> getType();

现在,您可以在子类中实现此方法:

class User extends AbstractUser<Account> {
    public Class<Account> getType() { return Account.class; }
}

编辑:

现在我意识到您需要扩展 AbstractType 的类型,解决方法应该仍然有效。您只需要在 AbstractAccount 中创建另一个 getType 并让 Account 实现该方法。

关于Java抽象类获取扩展类的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52772832/

相关文章:

java - 如何在 Java 中生成共享相同哈希码的字符串?

java - Java中如何重写equals方法

java - 如何让一个线程在固定的时间段内连续执行不同的任务?

java - 这个 URI URL 有什么问题? IllegalArgumentException,非法字符

java - 如何在自定义位置的 mac 上安装 java 7?

java - 较新依赖项中的 Maven 不同包名

java - android.content.res.Resources$NotFoundException : String resource ID #0x2 Database

java - Predicate<T> 方法 equals()

java - 计算两个 Java 日期实例之间的差异

java - ActionListener 如何将处理结果发送回 JTextArea