2016-11-20 10 views
1

は、次のデータ型を考えてみましょう変換することはできませんジェネリックは、

import java.util.ArrayList; 
import java.util.List; 

public class MyIntervalList<T extends Comparable<T>> extends MyList<IInterval<T>> { 

    public List<? extends IInterval<T>> getIntersect(T begin, T end) { 
    List<IInterval<T>> res = new ArrayList<>(); 
    for (IInterval v : data) { 
     if (v.getEnd().compareTo(begin) < 0 || 
      v.getBegin().compareTo(end) > 0) { 
     res.add(v); 
     } 
    } 
    return res; 
    } 
} 

次にしてみましょう使用例をaveの:

import java.util.List 

class Interval implements IInterval<Integer> { 
    private int begin, end; 

    public Interval(int begin, int end) { 
    this.begin = begin; 
    this.end = end; 
    } 

    public Integer getBegin() { 
    return begin; 
    } 

    public Integer getEnd() { 
    return end; 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
    MyIntervalList<Integer> t = new MyIntervalList<>(); 
    t.add(new Interval(1, 10)); 

    List<Interval> l = t.getIntersect(1, 4); 
    } 
} 

私はこれをコンパイルすると、私はエラーを取得:

Test.java:8: error: incompatible types: List<CAP#1> cannot be converted to List<Interval> 
    List<Interval> l = t.getIntersect(1, 4); 
            ^
    where CAP#1 is a fresh type-variable: 
    CAP#1 extends IInterval<Integer> from capture of ? extends IInterval<Integer> 
1 error 

Intervalとして実装IInterval<Integer>getIntersect? extends IInterval<T>を返すように宣言され、IntegerTとして渡された、私はこれを行う正しい方法だと思ったが、明らかに私は間違っている。

誰でも正しい方法を説明できますか?

+0

あなたが正しいと仮定しましょう。 'ArrayList 'のインスタンスが 'getIntersect'メソッド(' Interval2'は 'IInterval 'の別の実装です)によって返されたらどうなるでしょうか? – Karol

+0

問題があることを認識しています...これを正しく行う方法に関する提案はありますか? –

+0

これはあなたが期待しているものによって異なります。あなたの変数の型を 'List <?次のように定義されています。extendnterval > intersect = t.getIntersect(1,4); '?それはあなたの要件を満たしていますか? – Karol

答えて

1

最初に(それがComparableに型を制限する必要はありません)、それは何かを受け入れることができるようにMyListを微調整:

class MyList<T> { 
    protected List<T> data = new ArrayList<>(); 

    public void add(T v) { 
     data.add(v); 
    } 
} 

そして、それが含まれている区間の種類を指定するMyIntervalListの署名を変更します。

class MyIntervalList<T extends Comparable<T>, I extends IInterval<T>> extends MyList<I> { 
    public List<I> getIntersect(T begin, T end) { 
     List<I> res = new ArrayList<>(); 
     for (I v : data) { 
      if (v.getEnd().compareTo(begin) < 0 || 
       v.getBegin().compareTo(end) > 0) { 
       res.add(v); 
      } 
     } 
     return res; 
    } 
} 

今コンパイラが、それが扱っています間隔の種類を伝えることができ、そして幸せになります:

public static void main(String[] args) { 
    MyIntervalList<Integer, Interval> t = new MyIntervalList<>(); 
    t.add(new Interval(1, 10)); 
    List<Interval> intersect = t.getIntersect(1, 4); 
} 
関連する問題