泛型的Java泛型
我有一个界面:泛型的Java泛型,java,generics,Java,Generics,我有一个界面: public interface Human<D extends Details> { D getDetails(); } 基本上,我在寻找一种方法,使人更具体(我可以使用它自己的),但也是一个通用的,所以其他人可以扩展它(例如,GeDigielsSer()的婴儿将获得Super。GETDigILL(),并从它创建一个新的BabyDetails实例)。 class Man<T extends ManDetails> implements Huma
public interface Human<D extends Details> {
D getDetails();
}
基本上,我在寻找一种方法,使人更具体(我可以使用它自己的),但也是一个通用的,所以其他人可以扩展它(例如,GeDigielsSer()的婴儿将获得Super。GETDigILL(),并从它创建一个新的BabyDetails实例)。
class Man<T extends ManDetails> implements Human<T> {
public T getDetails(){return null;}
}
因为重写方法可以声明新的返回类型,只要该类型是在重写方法中声明的返回类型的子类型,例如
List<String> method()
List方法()
可以被
ArrayList<String> method();
ArrayList方法();
是BabyDetails
Mandetals的一个子类吗?是的,很抱歉没有提及,细节也是一个接口,Mandetals会实现它。一般来说,您应该避免具体类扩展其他具体类。那么您已经拥有的应该是好的。但是如何从Man类返回Mandetals呢?在这个解决方案中你不能这样做。@shayy你是什么意思?在Man
类
中,因此它也表示ManDetails
<代码>类Man实现人类{public mandetals getDetails(){return new mandetals();}}编译对我来说很好。这里有一个问题:Man
的实现应该返回什么?我觉得你在为自己设置ClassCastException
。T extends Details
可能应该在层次结构中的更高级别上定义,并且Man
应该提供ManDetails
作为参数。这现在也可以工作了,因为您可以声明您提到的新返回类型,但是如果我添加更多的方法,其中的泛型(ManDetails/BabyDetails)是在ctor中传递或作为方法参数传递,它将不起作用。@shayy您能否发布一些代码示例,说明此解决方案可能出现的问题?我并不是说我的答案是正确的,我只是一个想在将来使用Java的学生,所以我还在学习。无论如何,如果您使用manman=newman()创建Man
类的实例,我看不出这种方法会出什么问题
您只能将mandetals
的实例传递给它的setDetails(tt){…}
方法。这意味着您还可以传递BabyDetails
,因为它是mandetals
的子类型,但这是可以的(有或没有泛型)。
class Baby extends Man<BabyDetails> {
public BabyDetails getDetails(){...}
}
class Baby<T extends BabyDetails> extends Man<T> {
public T getDetails(){...}
}
public class Baby extends Man {
public BabyDetails getDetails(){...}
}
List<String> method()
ArrayList<String> method();