私はそれがinmediatly鐘を鳴らすので、私は、例を使って、これを聞いてますので、私は、それをGoogleにすることができない理由だと、これの正しい名前を覚えていません。
これは、Javaのためです。
私はちょうどこのように、有界型パラメータを持つ抽象クラスとインタフェースを使用しています:
public interface DBInterface<T, E> {
public int delete(T element);
}
私の問題は、私はこのような機能をオーバーロードしようとすることです:
public interface DBInterface<T, E> {
public int delete(T element);
public int delete(E example);
}
それは私が(、ので、実際には、Tは、その宣言の中でEと同じかもしれない)を2回とまったく同じメソッドを宣言しています考えているので、IDEは、Eと同じbeignもT文句を言います。
私questiosnは以下のとおりです。
- これはどのように呼ばれているのですか?私はそれが将来的に他の人のために、より便利になるように、適切な用語を使用して、質問を書き直したいです
- どのように私は、彼らが同じタイプではありません保証するためのインタフェースでTとEをdeclaseことができますか?
このようなもの:
public interface DBInterface<T, E != T> {
public int delete(T element);
}
私は今それをやっている方法は、このような法的な種類を区切ることです。それが正しい方法ですか?任意のオブジェクトが提供されている他のものをEXCEPTできるようにする方法はありますか?:
public interface DBInterface<T extends DatabaseObject, E> {
}
コンパイラはあなたの方法のためのパラメータ化された型の消去を使用しているため、問題があります。通りT
とE
ランタイムにそれをしないと、コンパイラは、体系的な方法であなたのメソッドのパラメータ型を置き換えます。
チュートリアルに従って(チェックこれとこれを無制限型パラメータがで置換されている)Object
、及び境界は有界型パラメータに適用されます。これは、コンパイルされたインターフェイスメソッドのシグネチャは次のようにしているということです。
public interface DBInterface {
public int delete(Object element);
public int delete(Object example);
}
そして、あなたの番目のバージョン:
public interface DBInterface<T extends DatabaseObject, E> {
public int delete(DatabaseObject element);
public int delete(Object example);
}
私はこれがあなたの最初のコードスニペットのための明白な問題になると考えています。
どのように私は、彼らが同じタイプではありません保証するためのインタフェースでTとEを宣言することができますか?
この質問は、資格のない答えを受け入れることはできません。実際の答えはの意味に依存T
してE
。例えば、それはそれはいくつかのケースでは意味をなさない可能性があるため、これらのタイプのパラメータは、別々に囲まれることを示唆しても意味がありません。
そうは言っても、あなたが考慮すべき一つのことは、メソッドの名前を変更されています。私は考えることができないDBInterface
様々な役割を果たしていない2つの同様に型指定されたパラメータを持ちます。例えば、方法があることができます:
public int deleteById(T element);
public int deleteByKey(E key);
我々は、単一の文字の汎用タイプ名規則を忘れていた場合は、他の言葉では、どのようなあなたの型パラメータに名前を付けるのでしょうか?
public interface DBInterface<IdColumnType, PKColumnType> {}
私は、これはあなたのメソッド名に適用されるべきではない、なぜ、あなたはあなたのユーザーは、すべての後に、両方のタイプの引数に同じクラスを渡すことができましたことを認識する必要が表示されない...(のはことを言っていること」 dが技術的にまだコンパイラは型消去をしなかった場合でも、問題を抱えています)