Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java nested templates like A<B, C extends A> usage

I want to define the following Java class:

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);
}

}

created so i can subclass:

public class DummyTemplateSubclass<S,  D extends DummyTemplateSubclass<S,D>> extends DummyTemplate<S, D>

(and the factoty of subclass returns DummyTemplateSubclass).

But the definition creates compile error:

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>

Probably because the DummyTemplate must have parameters, how to define it then? i get the error

it compiles howewer only :

public static<D extends DummyTemplate<String,D>> D  factory()

but then i got trouble on subclass:

public static<D extends DummyTemplateSubclass<String,D>> D  factory(){

Name clash: The method factory() of type DummyTemplateSubclass has the same erasure as factory() of type DummyTemplate but does not hide it

like image 333
user184868 Avatar asked Mar 30 '26 21:03

user184868


1 Answers

When you make a self-referencing template parameter like that, you can't use the template directly, because it's ever-expanding:

DummyTemplate<String, DummyTemplate<String, DummyTemplate<String, ...>>>

To use it, you must create a subclass:

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);
    }
}
like image 165
Andreas Avatar answered Apr 02 '26 13:04

Andreas



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!