Yesterday, I was designing a Java class which I wanted to be initalized with Lists of various generic types:
TheClass(List<String> list) {
...
}
TheClass(List<OtherType> list) {
...
}
This will not compile, as the constructors have the same erasure.
I just went with factory methods differentiated by their names instead:
public static TheClass createWithStrings(List<String> list)
public static TheClass createWithOtherTypes(List<OtherType> list)
This is less than optimal, as there isn't a single obvious location where all the different options for creating instances are available.
I tried to search for better design ideas, but found surprisingly few results. What other patterns exist for designing around this problem?
Differents solutions :
1) with tabs
2) with generics
I would love to know a neat fix for this issue.
I encounter the same problem often, and I usually fix it by just introducing a dummy parameter (such as
Void
) to the constructor, which is of course not the most elegant fix, but the best one I know of so far.Note, it would be possible to add method overloading on generic arguments with erasure, although wildcards would make it more difficult.
I would suggest using creation method with a name based on the interpretation of the types.
String
by itself doesn't have much meaning.createWithThingNames
, or something.Some statically-typed languages do not have method overload at all (deliberately).