You’re absolutely right. But using it in this fashion makes the calling method more consistent with non-Event function calls. In fact, it started out this way until I hit the check telling me to use the Execute thunk:
UBlueprintBaseClass* Blueprint = GetThatBlueprint();
IHasProbabilityCurveInterface* Probability = InterfaceCast<IHasProbabilityCurveInterface>( Blueprint );
const UCurveFloat* Curve = Probability->GetProbabilityCurve();
In this particular context, I am not null checking the result of the interface cast because the blueprint getter I am using is guaranteed to return a blueprint class that implements that interface. It is, in essence, a tacky way of doing multiple inheritance for a highly modular blueprint base.