Java 具有genric参数和返回类型的泛型方法

Java 具有genric参数和返回类型的泛型方法,java,generics,Java,Generics,我想创建一个泛型方法,其返回类型包含发送到该方法的泛型元素。 只要输入参数的类型与泛型类型完全相同,这就可以正常工作。但是,我希望能够发送泛型类型的扩展 基本上,我想创建一个方法createList,它可以用于这两个调用: List<Object> list = createList("foo"); List<String> list2 = createList("bar"); List List=createList(“foo”); List list2=创建列表(“

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

基本上,我想创建一个方法createList,它可以用于这两个调用:

List<Object> list = createList("foo");
List<String> list2 = createList("bar");
List List=createList(“foo”);
List list2=创建列表(“条形”);
下面的这个通用方法对第二次调用非常有效,但对第一次调用无效

private static <T> List<T> createList(T element) {
    List<T> list = new ArrayList<>();
    list.add(element);
    return list;
}
私有静态列表createList(T元素){
列表=新的ArrayList();
列表。添加(元素);
退货清单;
}
对于第二个调用,我得到一个编译错误,它是“不兼容的类型。必需的对象。找到的字符串”

下面是一个非通用版本,适用于第一次调用,但不适用于第二次调用:

private static List<Object> createList(Object element) {
    List<Object> list = new ArrayList<>();
    list.add(element);
    return list;
}
私有静态列表createList(对象元素){
列表=新的ArrayList();
列表。添加(元素);
退货清单;
}
此处的编译错误与其他版本相同,但需要此时间字符串,并且找到了对象


是否可以创建一个方法(最好使用泛型),使这两个调用都能工作?(使用Java7)

Java8中的一些类型推断更改解决了这个问题。因此,简单的解决方案是更新

如果您不能或不想更新到Java 8,还可以显式提供泛型类型:

List<Object> list = EnclosingClass.<Object>createList("foo");
List List=EnclosingClass.createList(“foo”);

其中
EnclosingClass
是声明
createList

我正在做类似的事情,并使用类似的方法解决了问题的类

此外,这并不限于任何特定的“类型”元素。它允许每个对象和/或基本体。它还为您提供了一个用一些元素填充已创建列表的一行程序

    @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);
@SafeVarargs
私有静态T生成列表(T集合、S…对象){
Collections.addAll(集合,对象);
回收;
}
//例如:
List list1=makeList(新的LinkedList(),“foo”,“bar”);
List list2=makeList(新的ArrayList(),1,2,3,4);

您还没有编写自己的名为
Object
的类,是吗?或者从某个奇怪的库中导入一个
对象
类?您的编译错误表明这里的
Object
没有通常的定义。您可以强制转换到Object:
createList((Object)“foo”)
我可以用Java 7复制,但在Java 8中效果很好。所以答案是更新。@DawoodibnKareem不,它是标准的Java对象(Java.lang.Object)。@jornverne我需要它来与Java 7一起工作。谢谢,提供泛型类型可以完美工作。(我无法更新到Java 8)