The confusion comes because DoubleSupplier interface, while beginning with a capital 'D' because it is a name of a class or an interface (well, an interface here) does not return a Double, as the name might suggest, but a primitive double, small 'd'.
As long as the implementation supplies something that can be promoted to a double, we are good.
That would include a byte, a short, an int, a long, a float, or a double itself.
The Integer we return can be auto-unboxed (more easily done than pronounced) to an int, which is merrily converted to a double.
There is an annoying rule to remember that upcasting before boxing can't be combined in one statement, but boxing before upcasting is fine.
This means we can't say this and have it work:
jshell> byte b = 7;
b ==> 7
jshell> Long L = b;
| incompatible types: byte cannot be converted to java.lang.Long
| Long L = b;
we also can't do this:
jshell> Byte B = 7;
B ==> 7
jshell> Long L = B;
| incompatible types: java.lang.Byte cannot be converted to java.lang.Long
| Long L = B;
We have no problem getting a primitive double out of our Byte, however:
jshell> double d = B;
d ==> 7.0
Because a DoubleSupplier, despite the initial capital 'D' in the name only requires something that can be upcast to a double primitive, perhaps after auto-unboxing, we are all good.