当前位置: 首页 > 知识库问答 >
问题:

当对派生类调用时,在基类中定义泛型方法,返回Java中的派生类类型

时修贤
2023-03-14
//Class GaeDataUtil
public static <T> Optional<Key<T>> saveEntity(T entity)
public class User extends RootEntity
public Optional<Key<T>> save() {
    //Skipping the error-handling.
    return GaeDataUtil.saveEntity(this);
}

我可以写:

User myUser = new User();
// set some properties
Optional<Key<User>> optKey = myUser.save();

但这当然不起作用,因为调用myuser.save()返回的是可选的 而不是我想要的可选的 >

我可以通过在user.save()(以及account.save()project.save()等)中键入类型并抑制警告来避免这个问题,但是即使只有(比方说)10个扩展rootentity的实体类,这仍然是为了键入而编写的样板代码。此外,我认为,如果我必须为每个派生类编写代码(无论多么小)(也会有其他类似的方法),那么拥有类层次结构的好处就会丧失很多。

对此有更好的解决方案吗?

更新:使用Java7。

共有1个答案

傅长恨
2023-03-14

您只需要在rootentity.save()方法中将其类型转换为泛型类型T

public <T> Optional<Key<T>> save() {
    //Skipping the error-handling.
    return (Optional<Key<T>> GaeDataUtil.saveEntity(this); // This line will generate a warning.
}

当你写的时候,

Optional<Key<User>> optKey = myUser.save();

由于目标类型推断,它将自动被正确地推断出来。

 类似资料:
  • 派生类可以通过提供同样签名的新版本(如果签名不同,则是函数重载而不是函数重定义)重新定义基类成员函数。派生类引用该函数时会自动选择派生类中的版本。作用域运算符可用来从派生类中访问基类的该成员函数的版本。 常见编程错误 9.3 派生类中重新定义基类的成员函数时,为完成某些附加工作.派生类版本通常要调用基类中的该函数版本。不使用作用域运算符会由于派生类成员函数实际上调用了自身而引起无穷递归。这样会使系

  • 假设我有一个没有数据的类: 和派生类 Empty类的对象的大小为1。派生类的空部分的大小通常为0。据我所知,编译器看到基Empty类没有数据,因此它可以优化Empty的大小,以防它“在”Derived中,但标准并不要求这样做。 所以问题是: 我能在编译时确定Derived类的Empty部分并没有占用内存吗。 我知道我可以像一样进行检查...但它太冗长了,并且有几个类,如派生。有没有更优雅的解决方案

  • 问题内容: 因此,此代码的输出为。现在,我想到了一个问题:作为 派生 类对象的 po 怎么能调用作为基类的 PrivateOverride 的私有方法? 问题答案: 因为您在类中定义了main方法。如果将main方法放在Derived类中,它将无法编译,因为在该类中不可见。 class中的po.f()调用不是多态的,因为in 类为,所以in class中的值不会被覆盖。

  • 问题内容: 我有以下代码片段: 执行代码时出现异常: 我不明白为什么会有和例外。有人可以帮助我理解吗? 您可以在此处检查代码。 问题答案: 创建一个对象,这意味着首先调用其超类构造函数,然后依次调用-但您已覆盖它,因此它是该方法的子版本。在该方法中,您调用尚未初始化的。 结论:在构造函数中调用可重写方法几乎从来不是一个好主意。

  • 代码:- 在这里,当我用mydog对象调用eat()方法时,它会打印出“dog eating”,有没有办法用mydog对象调用base Animal类的eat()方法,比如有没有像这样的东西 我不想使用super(),因为这样它也会从child类调用eat(),所以它会同时打印语句“animal eating”和“dog eating”,这是我不想要的,我想一次只调用一个语句。