java中的Custom Generic Collection Trim类

时间:2013-02-26 12:35:57

标签: java generics collections

我有一个场景,我想将相同的逻辑应用于不同的类型。

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
    }
} 

有没有办法实现这个目标?请告诉我。谢谢!

1 个答案:

答案 0 :(得分:7)

在我看来,您需要将trim()方法设为通用而不是TrimAlgo类:

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

毕竟,它不像你的修剪算法本身取决于类型 - 你可以使用相同的实例修剪List<String>List<Integer>