具有genric参数和返回类型的通用方法

时间:2018-01-16 09:44:38

标签: java generics

我想创建一个泛型方法,其返回类型包含发送到方法的泛型元素。 只要输入参数与泛型类型完全相同,这样就可以正常工作。但是我希望能够发送泛型类型的扩展名。

基本上,我想创建一个方法 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)

2 个答案:

答案 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);