5

Intellij Idea を使用して Java に関連する奇妙なエラーが発生しました。

したがって、そのようなインターフェースがあります:

<T> void save(T aEntity, DbTransaction dbTransaction, Class<T> clazz);
<T> void save(Collection<T> aEntities, DbTransaction dbTransaction, Class<T> clazz);

次のコードをコンパイルしようとすると:

@SuppressWarnings("unchecked")
@Override
public void save(Collection<T> aEntities, DbTransaction aDbTransaction) {
    baseDao.save(aEntities, aDbTransaction, getClass((T) aEntities.toArray()[0]));
}

次のコンパイル エラーが表示されます。

reference to save is ambiguous, both method <T>save(T,DbEntityHelper.DbTransaction,java.lang.Class<T>) in xzc.dao.IBaseDao and method <T>save(java.util.Collection<T>,DbEntityHelper.DbTransaction,java.lang.Class<T>) in xzc.dao.IBaseDao match

あなたはなにか考えはありますか ?事前に助けてくれてありがとう。

4

6 に答える 6

7

呼び出されTた 2 つのタイプがあり、それらが同じであるとは想定できません。2 番目の方法にある場合もあればT、最初の方法にある場合もあります。Collection<T>T

使用できます

baseDao.<T>save(....

また

baseDao.<Collection<T>>save(....

それがどちらであるべきかを明確にするために。それらをT同じ名前にしても、コンパイラは役に立ちませんし、混乱を招くだけかもしれません。

于 2012-08-06T12:39:40.557 に答える
2

2 つの保存方法の消去された署名は次のとおりです。

(Object, DBTransaction, Class)
(Collection, DBTransaction, Class)

コンパイラは、どちらを呼び出すつもりかを判断できません。ここでは明示的なキャストが役立ちます。

baseDao.save((Collection)aEntities, aDbTransaction, getClass((T) aEntities.toArray()[0]));
于 2012-08-06T12:40:24.533 に答える
2

次のように型を<T>明示的に指定してみてください。

baseDao.<Collection<T>>save(aEntities, aDbTransaction, getClass((T) aEntities.toArray()[0]));
于 2012-08-06T12:41:09.743 に答える
1

通常、型消去が原因でこの種のエラーが発生します。

コード内の他のメソッドをチェックして、タイプ情報のいずれかを削除するときにそれらがすべて異なることを確認してください。同じものが 2 つ以上ある場合、これが問題になる可能性があります。

消去については、Java Trail http://docs.oracle.com/javase/tutorial/java/generics/erasure.htmlでこれを参照してください。

クラスの残りを投稿できますか?

于 2012-08-06T12:40:45.330 に答える
0

テキストの色が異なる場所をクリックし、特定のクラスをインポートすることを選択しsave()ます (ショートカット キーを使用 - Mac は Alt-Enter)。または、完全修飾クラス名を使用して、2 つの異なるsave()メソッドを区別することもできます。

于 2012-08-06T12:34:01.150 に答える
0

タイプ eraserにより、これら 2 つのメソッドは同じシグネチャを持ちます。

簡単に言えば、実行時にすべての型情報が消去されるため、2 つのメソッドは実質的に次のようになります。

Object void save(Object aEntity, DbTransaction dbTransaction, Class clazz);
Object void save(Collection aEntities, DbTransaction dbTransaction, Class clazz);

パラメータは ですがCollectionTコレクションの は必ずしも他のメソッドと同じ Tではないため、両方のメソッドが一致する可能性があります。

Collectionまたはへの明示的なキャストを試みますObject

于 2012-08-06T12:39:13.550 に答える