If there is a 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>(null, null); } } 

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> although this is a valid type substitution. Where type D is set so that factory() returns exactly the type it needs: when you create a subclass, you declare

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

The question is how to define the type DummyTemplate<String, DummyTemplate> , if you constantly need to specify the template recursively?

    1 answer 1

     public class DummyTemplate<S> { S value; DummyTemplate<S> next; public DummyTemplate(S value, DummyTemplate<S> next) { super(); this.value = value; this.next = next; } public static DummyTemplate<String> factory() { return new DummyTemplate<>(null, null); } } 
    • Then there you can insert any DummyTemplate. The idea is that next was always the same type or subclass and had the same sign - user184868
    • Then it makes no sense to generate next. Fixed the decision. - nao4j
    • the point is to create a subclass public class DummyTemplateSubclass <S, D extends DummyTemplateSubclass <S, D >> extends DummyTemplate <S, D> {restrict type D as DummyTemplateSubclass <S, D> - user184868
    • Then you can specify such a template <S, D extends DummyTemplate <S,? >>. But it will not save it from passing to the ancestor instance of an instance class of a descendant of DummyTemplate <String, DummyTemplate <String,? >> dummyTemplate = new DummyTemplate <> ("str1", dummyTemplate2). But it will save DummyTemplate2 <String, DummyTemplate2 <String,? >> dummyTemplate2 = new DummyTemplate2 <> ("str2", dummyTemplate) // from the opposite case // will not compile. - nao4j