Designing constructors around type erasure in Java

百般思念 提交于 2019-12-23 17:53:28

问题


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?


回答1:


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.




回答2:


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).




回答3:


Differents solutions :

1) with tabs

class TheClass
{
 TheClass(String[] strings)   {}
 TheClass(Object[] others) {}
}

2) with generics

class TheClass<P>
{
 TheClass(P generic) {}
}


来源:https://stackoverflow.com/questions/2703584/designing-constructors-around-type-erasure-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!