Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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嵌套模板,如A<;B、 C扩展A>;使用_Java_Templates_Generics - Fatal编程技术网

Java嵌套模板,如A<;B、 C扩展A>;使用

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

我想定义以下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, 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