我想创建一个泛型方法,其返回类型包含发送到方法的泛型元素。 只要输入参数与泛型类型完全相同,这样就可以正常工作。但是我希望能够发送泛型类型的扩展名。
基本上,我想创建一个方法 createList ,它可以用于这两个调用:
List<Object> list = createList("foo");
List<String> list2 = createList("bar");
以下通用方法适用于第二次调用,但不适用于第一次调用。
private static <T> List<T> createList(T element) {
List<T> list = new ArrayList<>();
list.add(element);
return list;
}
对于第二次调用,我收到编译错误,说“不兼容的类型。必需的对象。找到字符串”。
以下是非通用版本,适用于第一次通话,但不适用于第二次通话:
private static List<Object> createList(Object element) {
List<Object> list = new ArrayList<>();
list.add(element);
return list;
}
此处的编译错误与其他版本相同,但此时需要String,并且找到了Object。
是否有可能以这两种调用都有效的方式创建方法(最好使用泛型)? (使用Java 7)
答案 0 :(得分:3)
Java 8中有一些类型推断更改可以解决此问题。因此,直接的解决方案是更新。
如果您不能或不想更新到Java 8,您还可以明确提供通用类型:
List<Object> list = EnclosingClass.<Object>createList("foo");
EnclosingClass
是声明createList
。
答案 1 :(得分:0)
我做了类似的事情,并使用这样的方法解决了问题。
此外,这不仅限于任何特定的&#34;类型&#34;元素。它允许每个对象和/或基元。 IT还为您提供了一个单行代码,用一些元素填充创建的列表。
@SafeVarargs
private static <T extends Collection<S>, S> T makeList(T collection, S... objects) {
Collections.addAll(collection, objects);
return collection;
}
//example:
List<String> list1 = makeList(new LinkedList<String>(), "foo", "bar");
List<Integer> list2 = makeList(new ArrayList<Integer>(), 1,2,3,4);