我有以下方法:
public static List<List<String>> createObject() {
List<List<String>> listOfListOfStrings = new LinkedList<List<String>>();
List<String> listOfStrings = new LinkedList<String>();
//do some populating on the lists here
listOfListOfStrings.add(listOfStrings);
return listOfListOfStrings;
}
现在我希望能够使用 ArrayList/Vector/Stack 而不是 LinkedList(如果需要的话可以进行不同的组合。我阅读了一些关于这个问题的泛型文章,我发现使用工厂模式来创建这些是最合适的(因为我不需要反射,并且因为使用通用 <T extends List<K>, K extends List<String>>
不起作用>.). 所以我想出的解决方案如下:
public class Tester {
public static void main(String[] args){
checkGenericsOfLists();
}
public static void checkGenericsOfLists(){
List<List<String>> listOfListOfStrings = createObject(new LinkedListFactory<List<String>>(), new LinkedListFactory<String>());
print(listOfListOfStrings);
translate(listOfListOfStrings);
print(listOfListOfStrings);
}
public static List<List<String>> createObject(ListFactorable mainListFactory, ListFactorable subListsFactory) {
List<List<String>> listOfListOfStrings = mainListFactory.create();//new LinkedList<List<String>>();
List<String> listOfStrings = subListsFactory.create();//new LinkedList<String>();
listOfStrings.add("A");
listOfListOfStrings.add(listOfStrings);
return listOfListOfStrings;
}
public static void transform(List<List<String>> listOfListOfStrings){
//do some abuse on the lists here.
}}
此解决方案会发出警告:
ListFactorable is a raw type. References to generic type ListFactorable should be parameterized
这是 createObject 方法签名。并且:
Type safety: The expression of type List needs unchecked conversion to conform to List of List of String>>
这适用于工厂调用 create() 方法的行。
但是如果我使用这个:
public static List<List<String>> createObject(ListFactorable<List<List<String>>, List<String>> mainListFactory, ListFactorable<List<String>, String> subListsFactory) {
List<List<String>> listOfListOfStrings = mainListFactory.create();//new LinkedList<List<String>>();
List<String> list = subListsFactory.create();//new LinkedList<String>();
list.add("A");
listOfListOfStrings.add(list);
return listOfListOfStrings;
}
我收到编译器错误:
The method createObject(ListFactorable<List<List<String>>,List<String>>, ListFactorable<List<String>,String>) in the type Tester is not applicable for the arguments (LinkedListFactory<List<String>>, LinkedListFactory<String>)
有什么办法可以让编译器不抛出警告或错误,并在 createObject 方法不知道所使用的 List 实现(在编译时)的情况下实例化这些列表?!
干杯,
暴君
编辑: 请原谅我没有发布其余的类(class)(我很愚蠢:))。我们开始吧:
public interface ListFactorable<T extends List<K>, K> {
T create();}
public class LinkedListFactory<K> implements ListFactorable<LinkedList<K>, K> {
public LinkedList<K> create(){
return new LinkedList<K>();
}}
EDIT2(尤金提出问题):
public interface EugeneListFactorable<T extends List<?>> {T create();}
public class EugeneLinkedListFactory implements EugeneListFactorable<LinkedList<?>> {
public LinkedList<?> create(){
return new LinkedList<List<?>>();
}
}
public static void checkGenericsOfLists2(){
List<List<String>> listOfListOfStrings = createObject(new EugeneLinkedListFactory(), new EugeneLinkedListFactory());
translate(listOfListOfStrings);
}
编译器错误:
- Type mismatch: cannot convert from LinkedList<?> to List<List<String>>
- Bound mismatch: The generic method createObject(EugeneListFactorable<N>, EugeneListFactorable<M>) of type
Tester is not applicable for the arguments (EugeneLinkedListFactory, EugeneLinkedListFactory). The inferred type LinkedList<?>
is not a valid substitute for the bounded parameter <N extends List<List<String>>>
请尝试编译并运行我发布的示例和您的解决方案。它是一个测试类,您可以轻松地在 IDE 上运行。谢谢!
最佳答案
以下内容“在我的机器上运行”,没有警告或错误。超出我的认知的是所有大惊小怪的原因 - 请参阅秒代码块。
public class Tester {
public static void main(String[] args) {
checkGenericsOfLists();
}
public static void checkGenericsOfLists() {
List<List<String>> listOfListOfStrings = createObject(
new LinkedListFactory<List<String>>(),
new LinkedListFactory<String>());
transform(listOfListOfStrings);
}
public static List<List<String>> createObject(
ListFactorable<List<List<String>>, List<String>> mainListFactory,
ListFactorable<List<String>, String> subListsFactory
)
{
List<List<String>> listOfListOfStrings = mainListFactory.create();
List<String> listOfStrings = subListsFactory.create();
listOfStrings.add("A");
listOfListOfStrings.add(listOfStrings);
return listOfListOfStrings;
}
public static void transform(List<List<String>> listOfListOfStrings) {
// do some abuse on the lists here.
System.out.println(listOfListOfStrings);
}
public interface ListFactorable<T extends List<K>, K> {
T create();
}
static public class LinkedListFactory<K> implements ListFactorable<List<K>, K> {
public LinkedList<K> create() {
return new LinkedList<K>();
}
}
}
这个解决方案更干净一些,消除了一些泛型噪音。
public class Tester2 {
public static void main(String[] args) {
checkGenericsOfLists();
}
public static void checkGenericsOfLists() {
List<List<String>> listOfListOfStrings = createObject(
new LinkedListFactory<List<String>>(),
new LinkedListFactory<String>());
transform(listOfListOfStrings);
}
public static List<List<String>> createObject(
ListFactory<List<String>> mainListFactory,
ListFactory<String> subListsFactory
)
{
List<List<String>> listOfListOfStrings = mainListFactory.create();
List<String> listOfStrings = subListsFactory.create();
listOfStrings.add("A");
listOfListOfStrings.add(listOfStrings);
return listOfListOfStrings;
}
public static void transform(List<List<String>> listOfListOfStrings) {
// do some abuse on the lists here.
System.out.println(listOfListOfStrings);
}
public interface ListFactory<T> {
List<T> create();
}
static public class LinkedListFactory<T> implements ListFactory<T> {
public List<T> create() {
return new LinkedList<T>();
}
}
}
关于java - List<List<String>> 泛型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7626672/