What you explain is a bit confusing for me.
When you cast, it is from an object that is already loaded into memory, so it is generally asked if it is valid.
Are you saying that with the interfaces you do some kind of magic and you don’t need to have the classes loaded in the game? Can you talk to the HUD without creating the widget?
If you have many references in the player and in the controller, you should think of another way of doing things.
I use event dispacher to get it super clean from cross referencing.
Also to mitigate the initial load, I have functions on demand that are only loaded into the game when it has to be used for the first time, or returns the object already loaded and cast