You're right that float is 32 bits and double is 64 bits. So from a point of view of widening the least wide parameter that matches should be used. O can understand that int which is 32 bits would prefer float over double. What surprises me is that long which is 64 bits would fit in a float. In fact I started a new topic regarding this.
As far as which is more specific, the explanation doesn't actually say that a long is more specific than a double. It says the Method that uses a long is more specific than the Method that uses a double. I guess the word specific has a specific meaning when it comes to OOP with regards to classes. I don't know if it's really proper to say one Method is more specific than another. In a sense I suppose you could say a float IS-A double because any float will fit in a double, but that's stretching it I suppose. It's just using IS-A in terms of a subset which is part of the meaning in OOP but doesn't taken into account things like polymorphism.
Oh well, I guess different people have different ideas about what is OOP - just look at C++