0

同じロジックを異なる型に適用したいシナリオがあります。

interface TrimAlgo<T> { 
public List<T> trim(List<T> input);
}

class SizeBasedTrim<T> implements TrimAlgo<T> { 
    private final int size;
    public SizeBasedTrim(int size) { 
        this.size = size; 
    }

    @Override 
    public List<T> trim(List<T> input) { 
         // check for error conditions, size < input.size etc. 
         return input.subList(0, size);
    }
} 

// Will have some other type of TrimAlgo

class Test { 
    private TrimAlgo<?> trimAlgo; 
    public Test(TrimAlgo<?> trimAlgo) { 
       this.trimAlgo = trimAlgo; 
    }

    public void callForString() { 
       List<String> testString = new ArrayList<String>(); 
       testString.add("1");
       trimAlgo.trim(testString); // Error The method get(List<capture#3-of ?>) in the type TrimAlgo<capture#3-of ?> is not applicable for the arguments (List<String>)
    }

    public void callForInt() { 
       // create int list and call trim on it
    }
} 

これを達成する方法はありますか?私にお知らせください。ありがとう!

4

1 に答える 1

7

クラスtrim()ではなく、メソッドを汎用にする必要があるように思われます。TrimAlgo

interface TrimAlgo { 
    <T> List<T> trim(List<T> input);
}

結局のところ、トリミングアルゴリズム自体がタイプに依存しているわけではありません。同じインスタンスを使用して、aList<String>とaの両方をトリミングできますList<Integer>

于 2013-02-26T12:38:55.313 に答える