Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Java, can one get away with using "raw unparameterised class"-es instead of using dummy interfaces?

Tags:

It's been a while since I touched generics in Java, I have this:

Map<List<MyGenericType>, Set<List<MyGenericType>>> x = new HashMap<>();

In truth, MyGenericType requires a generic parameter, since it is defined like this:

public class MyGenericType<X> {}

I declared x with pre-emptive type-erasure of MyGenericType because I didn't want to make an empty marker interface just for the sake of grouping things. Will this, for the sake of having a collection, work in my favor or will I have to make a marker interface to make this possible?

(EDIT) That is:

  1. public interface SomeCommonInterface {...}
  2. MyGenericType implements SomeCommonInterface ...
  3. Map<List<SomeCommonInterface>, Set<List<SomeCommonInterface>>> x = new HashMap<>();
like image 971
Novicegrammer Avatar asked Jul 11 '20 15:07

Novicegrammer


1 Answers

Recall that Integer as well as Double both extend Number and in turn, Number extends Object.

A List<Number> is in no way usable as a List<Integer> and vice versa. List<Number> x = new ArrayList<Integer> does not compile. This is called 'invariance', and it is 'correct', because if it did compile, you could add doubles to a list of integers which is obviously not right. It tends to throw people off, though, which is why I mention it. If you want covariance or contravariance, you must opt into this: List<? extends Number> list = new ArrayList<Integer>(); does compile. But then list.add(5); won't, because if it did, you would again be able to add doubles to a list of integers and that wouldn't be right.

Once you entirely omit generics on a thing, all type checking on generics is right out the door, and you don't want that. Can you 'get away with it'? Well, uh, the compiler will toss a bunch of warnings in your face and you turn off quite a bit of type checking. If you mean with 'get away with it': "Does it compile"? Yes, it does. If you mean: "Would this code pass any reasonable java coder's code review"? No, it won't.

Simple solution: What's wrong with using MyGenericType<?> here?

NB: Keys in maps should be immutable; list is not. Using it is therefore quite a bad plan; what is that supposed to represent?

like image 182
rzwitserloot Avatar answered Sep 30 '22 21:09

rzwitserloot