I've put some effort this, but only to conclude that there's no elegant solution for this. To verify the type, loadAsset() would need to know the AssetData class (from AssetFactory) which is not available.

I changed loadAssetData to return untyped AssetData (as before) and perform the casting in the calling method (load and 2x reload).