Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
泛型的Java泛型_Java_Generics - Fatal编程技术网

泛型的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();