Java嵌套模板,如A<;B、 C扩展A>;使用
我想定义以下Java类:Java嵌套模板,如A<;B、 C扩展A>;使用,java,templates,generics,Java,Templates,Generics,我想定义以下Java类: public class DummyTemplate<S, D extends DummyTemplate<S,D>> { S value; D next; public DummyTemplate(S value, D next) { super(); this.value = value; this.next = next; } public static DummyTemplate<String, Dum
public class DummyTemplate<S, D extends DummyTemplate<S,D>> {
S value;
D next;
public DummyTemplate(S value, D next) {
super();
this.value = value;
this.next = next;
}
public static DummyTemplate<String, DummyTemplate> factory(){
return new DummyTemplate<String, DummyTemplate>("wohoo", null);
}
}
公共类DummyTemplate{
S值;
D其次;
公共DummyTemplate(S值,D下一个){
超级();
这个值=值;
this.next=next;
}
公共静态DummyTemplate工厂(){
返回新的DummyTemplate(“wohoo”,null);
}
}
创建,以便我可以子类:
public class DummyTemplateSubclass<S, D extends DummyTemplateSubclass<S,D>> extends DummyTemplate<S, D>
public static<D extends DummyTemplateSubclass<String,D>> D factory(){
public class DummyTemplate<S, D extends DummyTemplate<S,D>> {
S value;
D next;
public DummyTemplate(S value, D next) {
this.value = value;
this.next = next;
}
}
public class StringTemplate extends DummyTemplate<String, StringTemplate> {
public StringTemplate(String value, StringTemplate next) {
super(value, next);
}
public static StringTemplate factory() {
return new StringTemplate("wohoo", null);
}
}
公共类DummyTemplateSubclass扩展了DummyTemplate
(子类的factoty返回DummyTemplateSubclass)
但该定义会产生编译错误:
Bound mismatch: The type DummyTemplate is not a valid substitute for the bounded parameter <D extends DummyTemplate<S,D>> of the type DummyTemplate<S,D>
绑定不匹配:类型DummyTemplate不是类型DummyTemplate的绑定参数的有效替代品
可能是因为DummyTemplate必须有参数,那么如何定义它呢?
我得到了错误
它仅编译howewer:
public static<D extends DummyTemplate<String,D>> D factory()
publicstaticd工厂()
但后来我在子类上遇到了麻烦:
public class DummyTemplateSubclass<S, D extends DummyTemplateSubclass<S,D>> extends DummyTemplate<S, D>
public static<D extends DummyTemplateSubclass<String,D>> D factory(){
public class DummyTemplate<S, D extends DummyTemplate<S,D>> {
S value;
D next;
public DummyTemplate(S value, D next) {
this.value = value;
this.next = next;
}
}
public class StringTemplate extends DummyTemplate<String, StringTemplate> {
public StringTemplate(String value, StringTemplate next) {
super(value, next);
}
public static StringTemplate factory() {
return new StringTemplate("wohoo", null);
}
}
publicstaticd工厂(){
名称冲突:DummyTemplateSubclass类型的方法factory()与factory()具有相同的擦除DummyTemplate类型的,但不隐藏它,因为
工厂
方法是静态
,而DummyTemplate
的第二个参数是D扩展DummyTemplate
,所以需要声明一个新的泛型类型,如下所示:
public static <T extends DummyTemplate<String, T>> DummyTemplate<String, T> factory() {
return new DummyTemplate<String, T>("wohoo", null);
}
创建这样的自引用模板参数时,不能直接使用该模板,因为它一直在扩展:
DummyTemplate<String, DummyTemplate<String, DummyTemplate<String, ...>>>
DummyTemplate
要使用它,必须创建一个子类:
public class DummyTemplateSubclass<S, D extends DummyTemplateSubclass<S,D>> extends DummyTemplate<S, D>
public static<D extends DummyTemplateSubclass<String,D>> D factory(){
public class DummyTemplate<S, D extends DummyTemplate<S,D>> {
S value;
D next;
public DummyTemplate(S value, D next) {
this.value = value;
this.next = next;
}
}
public class StringTemplate extends DummyTemplate<String, StringTemplate> {
public StringTemplate(String value, StringTemplate next) {
super(value, next);
}
public static StringTemplate factory() {
return new StringTemplate("wohoo", null);
}
}
公共类DummyTemplate{
S值;
D其次;
公共DummyTemplate(S值,D下一个){
这个值=值;
this.next=next;
}
}
公共类StringTemplate扩展了DummyTemplate{
公共StringTemplate(字符串值,StringTemplate下一个){
超级(值,下一个);
}
公共静态StringTemplate工厂(){
返回新的StringTemplate(“wohoo”,null);
}
}
public static DummyTemplate factory()不编译,也不public static DummyTemplate factory()@user184868抱歉,我之前无意中从中删除了static
,但没有注意到。您现在应该可以自由为子类创建工厂方法,但请记住,static
方法在Java中无法重写。不,我仍然得到名称冲突:方法工厂()DummyTemplateSubclass类型的具有与factory()相同的擦除DummyTemplate类型,但不隐藏它是的,您不能在子类中使用相同的名称工厂
,因为无法重写静态
方法。我已在DummyTemplateSubclass
中命名了该方法工厂子类
。嗯,好的。现在我尝试使用它,而不是静态的:
公共DummyTemplate工厂(){
返回新的DummyTemplate(“DummyTemplate”,null);
}然后i子类:
公共类DummyTemplateSubclass扩展DummyTemplate{,然后
DummyTemplateSubclass dummy=new
DummyTemplateSubclass(“noob”,null);
DummyTemplate fa=dummy.factory();
System.out.println(fa.getClass());返回类templates.DummyTemplate,但D必须是DummyTemplateSubclass