繁体   English   中英

Java 1.6-> 1.8,相同的擦除编译错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM