我不知道怎么表达这个,所以我举个例子
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/