Java 具有相同类型擦除的方法在不重命名方法名称的情况下解决此问题

Java 具有相同类型擦除的方法在不重命名方法名称的情况下解决此问题,java,Java,在不重命名方法的情况下,解决此类型擦除的最佳方法是: GetResultSet GetEntityString entityType,映射属性条件; GetResultSet GetEntityString entityType,映射blobConditions; 最好的方法是重命名该方法 您还可以使用专用子类替换映射来描述过滤器选项,因为它们的类型不会被删除: class PropertyConditions { Map<String, PropertyCondition> con

在不重命名方法的情况下,解决此类型擦除的最佳方法是:

GetResultSet GetEntityString entityType,映射属性条件; GetResultSet GetEntityString entityType,映射blobConditions;
最好的方法是重命名该方法

您还可以使用专用子类替换映射来描述过滤器选项,因为它们的类型不会被删除:

class PropertyConditions { Map<String, PropertyCondition> conditions }

GetResultSet<Entity> getEntities(String entityType, PropertyConditions propertyConditions);

如果您想要混淆解决方法,还可以通过切换参数顺序或引入伪参数来消除参数签名的歧义。

您可以保留其中一个方法,并在该getEntities中检查映射成员的实例并相应地采取行动


添加伪参数确实解决了这个问题,但那样的话,您必须遍历调用这些方法的所有情况并添加参数。

如第一条注释中所述,这是不可能的,因为在类型擦除之后,方法签名将是相同的

为了保持尽可能多的类型安全性,并且只有一个方法名,我将只创建一个方法:

<T extends Condition> GetResultSet<Entity> getEntities(String entityType, 
                                               Map<String, T> propertyConditions);
让PropertyCondition和BlobCondition实现这个新的接口条件或者抽象类


好消息是,您可以将可能的公共方法移动为接口默认方法或抽象类方法。不好的是,您将不得不使用instanceof运算符进行任何特定于实现的处理。

因为擦除字面上意味着删除了两者之间的内容,所以这些方法签名之间没有区别,除了重命名方法之外,什么也做不了。无论如何,据我所知,把其中一个参数的顺序颠倒一下怎么样?让其中一个接受比Map更具体的类型?是否将其中一个字符串参数更改为char[]?这是一个相当广泛的问题。除了泛型之外,没有什么可以区分这些方法,我认为重命名这两种方法可能是个好主意。从长远来看,getEntitiesByProperty和getEntitiesWithBlob可能工作得更好。有时简洁并不是一种美德。传递字符串entityType而不是让该类型与通用返回类型GetResultSet进行检查也有一点设计味道。是的,这就是我最终得到的结果。是的,这实际上是有道理的