[英]Java 1.6 -> 1.8, same erasure compile error
我正在将Java应用程序从1.6移植到1.8,并且编译器对以下代码中的getAbstractTransactionCriteria()
方法不满意:
public abstract class AbstractTransaction ...
public class TemplateTransaction extends AbstractTransaction ...
public class Transaction extends AbstractTransaction ...
abstract class AbstractTransactionCriteria {...}
class TransactionCriteria extends AbstractTransactionCriteria {...}
class TemplateCriteria extends AbstractTransactionCriteria {...}
TransactionCriteria getAbstractTransactionCriteria(Class<Transaction> c) {...}
TemplateCriteria getAbstractTransactionCriteria(Class<TemplateTransaction> c) {...}
编译器告诉我这两种方法具有相同的擦除,我可以接受,因为我在其他地方看到过尖括号内的内容被编译器替换为Object
。
参数c
仅用于实现多态性(方法主体中未使用它们),并且过去在Java 1.6中可以完美地工作。
我应该怎么做才能在1.8中获得相同的结果?
为什么不为此使用泛型? 像这样的东西:
public <T extends AbstractTransactionCriteria> T getAbstractTransactionCriteria(Class<T> c) {}
// or
public <T extends AbstractTransactionCriteria> T getAbstractTransactionCriteria(T t) {}
这样,您只需要一种方法。 现在我知道这两种方法可能完全不同(从内容角度而言)。 尽管您甚至可以简单地检查传入的参数类型,并据此执行操作。
编辑:
我提到了支持多态的静态placeHolder。 基本上,如果您同时看到以上两种方法,则一个请求一个Class对象,而另一个请求一个实例(通常不太理想,因为您调用此方法来创建实例,而不是传入一个实例)。
如果您不想使用如上所述的genericType,则还可以选择执行以下操作:
abstract class AbstractTransactionCriteria {...}
// SubClass layout
class TransactionCriteria extends AbstractTransactionCriteria {
// dummy instance doing nothing.
public static final TransactionCriteria type = new TransactionCriteria();
}
class TemplateCriteria extends AbstractTransactionCriteria {
// dummy instance doing nothing.
public static final TemplateCriteria type = new TemplateCriteria ();
}
// method layout
TransactionCriteria getAbstractTransactionCriteria(TransactionCriteria t)
{...}
TemplateCriteria getAbstractTransactionCriteria(TemplateCriteria t)
{...}
// Call methods
TransactionCriteria transaction = getAbstractTransactionCriteria(TransactionCriteria.type);
TemplateCriteria transaction = getAbstractTransactionCriteria(TemplateCriteria.type);
如您所见,通过这种方式可以使用“旧”布局。 尽管这是唯一的方法,但我还是建议您重新设计当前的模式,因为它绝对不理想。 (如前所述,您可能要考虑为每个方法使用不同的名称,因为在这种情况下,它们返回的结果与其方法名称建议的结果不同)
如果您可以随意更改函数原型,并且不使用参数来确定返回类型,那么以下内容对您有用吗?
TransactionCriteria getAbstractTransactionCriteria(Transaction c) {...}
TemplateCriteria getAbstractTransactionCriteria(TemplateTransaction c) {...}
另外,您可以使用不同的函数名称,并且不要使用任何参数。 例如
TransactionCriteria getAbstractTransactionCriteria() {...}
TemplateCriteria getAbstractTemplateCriteria() {...}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.