2016-05-13 8 views
2

私は自分のドメインモデルの次のエンティティを持っている:Javaのジェネリック上位有界ワイルドカードエラー

class Point { 
    public String details; 

    public Point() { 
     details = "empty"; 
    } 

    public Point(String details) { 
     this.details = details; 
    } 
} 

class BasicPoint<X, Y> extends Point { 
    public X x; 
    public Y y; 

    public BasicPoint() {} 

    public BasicPoint(X x, Y y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

class Collector<T> { 
    T elem; 

    public void collect(T elem) { 
     this.elem = elem; 
    } 
} 

私はデータの操作を適用し、上記の宣言のように、ポイントやBasicPointように、そのデータを返すようにしたいが、コンパイラがありますOUTポイントを拡張するが、次のエラーで文句を言うことは:

Collector<BasicPoint<Integer, Integer>> c = new Collector<>(); 
c = new Operator<BasicPoint<Integer, Integer>>().operate(c); 
System.out.println(c.elem.getClass() == new BasicPoint<Integer, Integer>().getClass()); 
+0

IDEを開いて出力を生成します。 – user1933888

+0

問題は、コードがコンパイルされず、質問に定義されているオペレータクラスにエラーが表示されることです。 – zequihg50

+0

次にコンパイラエラーは何ですか? –

答えて

2

class Operator<OUT extends Point> { 
    public Collector<OUT> operate(Collector<OUT> collector) { 

     // compile error, collect(OUT) cannot be applied to BasicPoint<Integer, Integer> 
     collector.collect(new BasicPoint<Integer, Integer>(1,2)); 

     return collector; 
    } 
} 

Mainメソッドは次のようになります。

Operatorは、をBasicPointに適用することはできません。OUTのみです。あなたのCollector抽象作ることができます。

abstract class Operator<OUT extends Point> { 
    abstract Collector <OUT> operate(Collector<OUT> collector); 
} 

そしてBasicPointOperatorは、あなたがしたい実際の実装が含まれます。ビットより一般的である

class BasicPointOperator extends Operator<BasicPoint<Integer, Integer>> { 

    @Override 
    Collector<BasicPoint<Integer, Integer>> operate(Collector<BasicPoint<Integer, Integer>> collector) { 
     collector.collect(new BasicPoint<Integer, Integer>(1,2)); 
     return collector; 
    } 
} 

またはPointOperatorを、

class PointOperator extends Operator<Point> { 

    @Override 
    Collector<Point> operate(Collector<Point> collector) { 
     collector.collect(new BasicPoint<Integer, Integer>(1,2)); 
     return collector; 
    } 
} 
+0

Afaikは最初にプログラムした方法で動作しますか?作業?コンパイラは 'Operator'の中の' OUT'の型を無視していると思います。 – hinneLinks

+1

'BasicPoint'の型が' OUT'ではないので、動作しません。彼らはちょうど共通の先祖「ポイント」を持っています。 –

1

問題は、タイプパラメータが0以外の場合、に入れることができないことです。 contravariant。そのようなもの

public Collector<?> operate(Collector<? super Point> collector) { 
    collector.collect(new BasicPoint<Integer, Integer>(1,2)); 
    collector.collect(new Point()); 

    return collector; 
} 
関連する問題