Java泛型的泛型

3

我有一个接口:

public interface Human<D extends Details> {
    D getDetails();
}

这是一个具体的实现:

public class Man implements Human<ManDetails> {
    ManDetails getDetails();
}

我希望能够扩展 Man 的功能,从而实现以下类似的操作:
public class Baby extends Man {
    BabyDetails getDetails();
}

基本上,我正在寻找一种方法,使Man成为具体的(我可以单独使用它),但也是一种通用的方式,以便其他人可以扩展它(例如,Baby的getDetails()将获得super.getDetails()并从中创建一个新的BabyDetails实例)。


2
BabyDetails 是否是 ManDetails 的子类? - Sotirios Delimanolis
是的,抱歉没有提到,Details也是一个接口,而ManDetails实现了它。 - shayy
1
一般来说,您应该避免具体类扩展其他具体类。 - Oliver Charlesworth
1
那么你已经拥有的应该已经很好了。 - Sotirios Delimanolis
1个回答

1
您可以考虑将您的代码更改为:


class Man<T extends ManDetails> implements Human<T> {
    public T getDetails(){return null;}
}

这将让你做类似于的事情。
class Baby extends Man<BabyDetails> {
    public BabyDetails getDetails(){...}
}

or

class Baby<T extends BabyDetails> extends Man<T> {
    public T getDetails(){...}
}

但是正如Sotirios Delimanolis已经提到的那样,你已经做得很好了。

public class Baby extends Man {
    public BabyDetails getDetails(){...}
}

因为覆盖方法可以声明新的返回类型,只要这个类型是被覆盖方法中声明的返回类型的子类型,例如

List<String> method()

可以被覆盖。
ArrayList<String> method();

但是如何从Man类返回ManDetails呢?在这个解决方案中你无法这样做。 - shayy
@shayy 你是什么意思?在 Man 类中 <T extends ManDetails>,所以它也代表了 ManDetailsclass Man implements Human<ManDetails> { public ManDetails getDetails(){return new ManDetails();} } 对我来说编译良好。 - Pshemo
这里有一个问题:Man的实现应该返回什么?我感觉你正在为ClassCastException做准备。T extends Details 应该在层次结构的更高级别上定义,而 Man 应该提供 ManDetails 作为参数。 - Sotirios Delimanolis
也许现在这个方法可以工作,因为你可以像你提到的那样声明一个新的返回类型,但是如果我添加更多的方法,其中泛型(ManDetails/BabyDetails)被传递到构造函数或方法参数中,它将无法工作。 - shayy
那么,是什么阻止你去做呢?你可以在Man类中创建public Iterable<ManDetails> getDetailsList()方法。你甚至可以将其声明为public Iterable<T> getDetailsList()并在Baby类中使用它,如果你从类型为Baby<BabyDetails>的引用调用它,它将被视为public Iterable<BabyDetails> getDetailsList() - Pshemo
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接