When there is a type mismatch (e.g. String vs Integer) in a constraint, usually a type is coerced and a rule is fired.
As far as I investigate, in case of AlphaNode, MVEL does the coercion. Also AlphaNode hashing does the coercion (https://github.com/kiegroup/drools/blob/7.5.0.Final/drools-core/src/main/java/org/drools/core/reteoo/CompositeObjectSinkAdapter.java#L748).
However, in case of JoinNode, it doesn't coerce so doesn't fire.