interface Adder<T, L extends List<T>> {
void add(L list, T t);
}
class ArrayListAdder implements Adder<String, ArrayList<String>> {
@Override
public void add(ArrayList<String> list, String t) {
list.add(t);
}
}
Я не думаю, что связывание T
возможно в add
время определения, поскольку T
должно быть известно, чтобы объявить L
с параметром типа (оно должно быть задано либо в связанной, либо в несвязанной форме ).
Я полагаю, вы ищете эквивалент этого кода C ++ 0x:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
template <template <typename _ElementT, typename _AllocatorT> class CollectionT>
struct Adder {
template <typename ElementT, typename AllocatorT>
void add(CollectionT<ElementT, AllocatorT> &collection, ElementT element);
};
struct VectorAdder : public Adder<std::vector> {
template <typename ElementT, typename _Alloc>
void add(std::vector<ElementT, _Alloc> &vector, ElementT element) {
vector.push_back(element);
}
};
int main() {
std::vector<int> vi;
vi.push_back(1);
std::vector<double> vd;
vd.push_back(1.1);
VectorAdder va;
va.add(vi, 2); // instantiates VectorAdder::add<int, ...>
va.add(vd, 2.2); // instantiates VectorAdder::add<double, ...>
for_each(vi.begin(), vi.end(), [](int x) { std::cout << x << ' '; });
for_each(vd.begin(), vd.end(), [](double x) { std::cout << x << ' '; });
return 0;
}
И я почти уверен, что в Java это невозможно.