我有一个场景,我想将相同的逻辑应用于不同的类型。
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
}
}
有没有办法实现这个目标?请告诉我。谢谢!
答案 0 :(得分:7)
在我看来,您需要将trim()
方法设为通用而不是TrimAlgo
类:
interface TrimAlgo {
<T> List<T> trim(List<T> input);
}
毕竟,它不像你的修剪算法本身取决于类型 - 你可以使用相同的实例修剪List<String>
和List<Integer>
。