Thanks for providing a complete test case.
The Wrap interface ignores its type parameter, so any type that
implements a isWrap method with no arguments and no results will
implement Wrap with any type argument. The argument to Extract is
Wrap[A], so you can pass anything with an isWrap method to Extract.
The type Val[int] does have an isWrap method, so it's fine to pass
that type to Extract[int].
I don't understand what your code is trying to do, but the behavior
seems entirely correct to me.
Ian