0

getAbstractTransactionCriteria()我正在将我的 Java 应用程序从 1.6 移植到 1.8,编译器对以下代码中的方法不满意:

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 中获得相同的结果?

4

2 回答 2

1

为什么不为此使用泛型?像这样:

 public <T extends AbstractTransactionCriteria> T getAbstractTransactionCriteria(Class<T> c) {}
 // or
 public <T extends AbstractTransactionCriteria> T getAbstractTransactionCriteria(T t) {}

这样你只需要一种方法。现在我知道这两种方法可能完全不同(内容方面)。尽管您甚至可以简单地检查传入的参数类型,并相应地执行操作。

编辑:
我提到了一个静态 placeHolder 来支持多态性。基本上,如果您看到上面的两种方法,一个请求一个 Class 对象,而另一个请求一个实例(通常不太理想,因为您调用此方法来创建实例,而不是传入一个实例)。

如果你不想像上面描述的那样使用 genericTypes,你也可以选择做这样的事情:

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

如您所见,这样可以使用您的“旧”布局。虽然如果这是唯一的方法,我会坚决建议你重新设计你当前的模式,因为它绝对不理想。(如前所述,您可能需要考虑为每个方法使用不同的名称,因为在这种情况下,它们返回的结果可能与方法名称所暗示的不同)

于 2016-10-25T06:00:44.027 回答
0

如果您可以随意更改函数原型,并且除了确定返回类型外不使用参数,那么以下内容对您有用吗?

TransactionCriteria getAbstractTransactionCriteria(Transaction c) {...}
TemplateCriteria    getAbstractTransactionCriteria(TemplateTransaction c) {...}

或者,您可以使用不同的函数名称并且让它们不带参数。例如

TransactionCriteria getAbstractTransactionCriteria() {...}
TemplateCriteria    getAbstractTemplateCriteria() {...}
于 2016-10-25T05:48:21.280 回答