3 ms·
Besides those you also can't do something like Object xyz = ...; if (xyz instanceof List<String>) { doA(); } else if (xyz instanceof List<Integer>
by Matthias247 8y ago
Besides those you also can't do something like
Object xyz = ...;
if (xyz instanceof List<String>) { doA(); }
else if (xyz instanceof List<Integer> { doB(); }
because there is only a single List type at runtime.
- bunderbunder 8y agoAs long as you are able to take the same code path for all empty lists, you can do something like if (xyz instanceof List) { if (xyz.isEmpty()) { ... } else if (xyz.get(0) instanceof String) { ... } else if (xyz.get(0) instanceof Integer) { ... } } Which, I admit, is a gross hack.
- int_19h 8y agoAnd, conversely, you can't implement both List<String> and List<Integer> on the same class.
- bunderbunder 8y agoThough, even in C#, it would be inadvisable. If you have the same class implement both `IList<String>` and `IList<int>` you'll have some ambiguity to deal with in implementing object IList.this[int index] { ... } The expectation is that that property's getter should just upcast the return value of the generic version of the indexer. For both languages, you'd be better off having two separate methods for the two different kinds of list.
- int_19h 8y agoThe point of doing this is not to invoke these members directly on the object, though. It's to allow the object to be passed to anything that expects either IList<string> or IList<int>, or for runtime discovery purposes with is/as. Perhaps a better example is something like IConvertibleTo<T>. There's an obvious meaning to a class implementing it for many different Ts.