Java, strong typing, covariance and contra-variance
"Structurally typed" means that you don't need to write implements I: if your type has all the methods I has, with compatible signatures, it's automatically a subtype of I. However, in this case, C.equals(C) does not implement I.equals(I) (due to variance) and so C isn't a subtype of I.

EDIT: 


  I'll explain: For C to be structurally equivalent to I we need to know the type hierarchy for the arguments of equals.


Yes, here you have recursive structural types, which complicate the issue quite a bit.


  The equals method in C changes the paramater in a covariant way and so it doesn't match the equals method in I.


This is strictly speaking incorrect, this isn't covariant (again, since C isn't a subtype of I). It should instead say e.g. "if we assume C is a subtype of I, then the equals method in C changes the parameter in a covariant way and we get a contradiction". You could claim C and I should be treated as equivalent (i.e. both subtypes of each other), and then there is no contradiction. 

Another problem is that definition of C depends on C itself, so you have recursive structural types, which complicate the language quite a bit.