1

そのクラスのメソッド内でジェネリッククラスをインスタンス化しようとしていますが、コンパイル時にエラーが発生します。うまくいけば、誰かがここでいくつかの洞察を提供することができます:

//returns a new ILo<T> with all items in this list that satisfy
//the given predicate
public ILo<T> filter(ISelect<T> pred);


// Represents a nonempty list of items of type T
class ConsLo<T> implements ILo<T>{
    T first;
    ILo<T> rest;


//returns a new ILo<T> with all items in this list that satisfy
//the given predicat
public ILo<T> filter(ISelect pred) {
    return new ConsLo<T>(pred.select(this.first),
             this.rest.filter(pred));
}

メソッドのインターフェース定義、ConsLoクラスの定義、そして私が扱っているメソッド宣言を提供しました。あらゆるタイプと述語predで機能するように、物事を一般的に保ちながら、このクラスをインスタンス化する方法がわかりません。コンパイラエラーは次のとおりです。

ILo.java:95: error: method select in interface ISelect<T#3> cannot be applied to given types;
return new ConsLo<T>(pred.select(this.first),
                         ^
required: T#1
found: T#2
reason: actual argument T#2 cannot be converted to T#1 by method invocation conversion
where T#1,T#2,T#3 are type-variables:
T#1 extends Object declared in method <T#1>filter(ISelect<T#1>)
T#2 extends Object declared in class ConsLo
T#3 extends Object declared in interface ISelect
4

1 に答える 1

2

の汎用バージョンを使用する必要がありますISelect

public ILo<T> filter(ISelect<T> pred) {
    return new ConsLo<T>(pred.select(this.first),
        this.rest.filter(pred));
}

この方法predISelect<T>、ISelectではなく、2つのタイプT#1でありT#2、コンパイラーが不平を言っています。

于 2013-03-07T14:53:44.760 に答える