Don't understand the difference between Foo<T extends Foo> and Foo<T extends Foo<T>>

53 Views Asked by At

It is hard for me to understand the simulated self type idiom

abstract class Foo<T extends Foo>
{
    public abstract T doSomething();
}

and

abstract class Foo<T extends Foo<T>>
{
    public abstract T doSomething();
}

In both cases doSomething() returns a type which is Foo or a sub type of Foo

So basically it says that the type parameter of T must extend Foo or be Foo. Where do I need now the Foo<T> or in which cases do I need the second one instead of the first one? What do I am missing out?

I am looking for cases where the first one would not work but the second one would.

0

There are 0 best solutions below