I have done both C# and Java "enterprise-y" programming. I don't really see the difference in the end product. If anything, Java was more open source oriented earlier, so the open source libraries look a bit different. It's a bit like a second version of New Zealand on the opposite side of the planet! They evolved slightly differently... But overall: I see so little difference for server side programming. (Please leave aside the Holy Wars about GUIs: C# XAML/WPF crushes, except for cross-platform where Java Swing was the only option for years.)
But yes, I see your point about snark / mud slinging. (The best mud you can sling back at C#: "You didn't have solid UNIX support for 15 years".) I saw the same between Perl and Python people 20 years ago. Being "fluent" in both, I never understood the fuss. They felt so similar, except syntax. You could write imperative code that looked and worked the same...
Finally, to me, the whole point of interface with "single" implementation is to easily facilitate mocking frameworks, like Java Mockito. (I am sure C# has something similar by 2022.) When the mock is created, byte code generates an ephemeral 2nd implementation. I never used Spring Framework much, but I think I can see what you mean when using @Autowire annotation constructors with interface type arguments. Spring can easily guess the correct implementation to inject.
But yes, I see your point about snark / mud slinging. (The best mud you can sling back at C#: "You didn't have solid UNIX support for 15 years".) I saw the same between Perl and Python people 20 years ago. Being "fluent" in both, I never understood the fuss. They felt so similar, except syntax. You could write imperative code that looked and worked the same...
Finally, to me, the whole point of interface with "single" implementation is to easily facilitate mocking frameworks, like Java Mockito. (I am sure C# has something similar by 2022.) When the mock is created, byte code generates an ephemeral 2nd implementation. I never used Spring Framework much, but I think I can see what you mean when using @Autowire annotation constructors with interface type arguments. Spring can easily guess the correct implementation to inject.