私はジェネリックスに新しく、必要な情報を提供しようとしている小さなプログラムでそれらを使用しようとしたときに、次の問題が発生しました。メソッド引数の汎用型変換が不可能な理由は何ですか?
私は必要なものだけを提供しようとしますが、欠けているものがあれば、私に知らせて、必要なものを提供します。
最初のものは、次のインタフェースである。
1: public interface IPrice<T extends IPrice<T>> {
2: void setPriceToZero();
3: T addPrice(T price);
4: T subtractPrice(T price);
5: T multiplyPriceByFactor(int factor);
6: String priceToString();
7: }
それがクラスBnSPriceによって実装されます。ここでの、おそらく必要な部分:
1: public class BnSPrice implements IPrice<BnSPrice> {
2: public BnSPrice subtractPrice(BnSPrice price) {...}
2: }
今の部分はコンパイルされませんこれは、私は本当に理解しない:私は何を得る
1: public static void main(String[] args){
2: [...]
3: IPrice<? extends BnSPrice> test = new BnSPrice(5);
4: test.subtractPrice(new BnSPrice(5));
5: [...]
6: }
が
"Error:(27, 28) java: incompatible types: main.bnsCalculatorModel.BnSPrice >cannot be converted to capture#1 of ? extends >main.bnsCalculatorModel.BnSPrice"
です私が減算法を呼び出す行で。
なぜこのようなことが起こりますか、これを修正して、まだインターフェイスにプログラムできるようにするにはどうすればよいですか?
(私の目標は、将来的には他の「物価の種類」で私のプログラムを拡張することは容易でなければならないということである。)
行番号を追加してください!エラーが行の 'IPrice <? BnSPrice> test = new BnSPrice(5); '?を拡張します。 – Pyranja
[ジェネリック型が引数に適用できない理由は、両方のスーパークラスを拡張する理由?](http://stackoverflow.com/questions/21452966/why-generic-type-is-not-applicable-for-argument-extends -super-class-for-both) –
行番号が追加されました。コードブロック3行目にエラーがありました。説明にSweeperはいい仕事をしました。 – Wolfone