0

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コンパイラは、2 つのメソッドの消去が同じであることを教えてくれます。山かっこ内のものがコンパイラによって置き換えられることを他の場所で見たので、これを受け入れることができます。

引数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) {}

このように、必要なメソッドは 1 つだけです。現在、両方の方法が完全に異なる可能性があることを認識しています(コンテンツに関して)。ただし、渡された引数の型を簡単に確認し、それに応じてアクションを実行することもできます。

編集:
ポリモーフィズムをサポートする静的プレースホルダーについて言及しました。基本的に、上記の両方のアプローチが見られる場合、一方が 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 に答える