为什么可以';我是否显式地将类型参数传递给泛型Java方法?

为什么可以';我是否显式地将类型参数传递给泛型Java方法?,java,generics,syntax,Java,Generics,Syntax,我定义了一个Java函数: static <T> List<T> createEmptyList() { return new ArrayList<T>(); } 静态列表createEmptyList(){ 返回新的ArrayList(); } 有一种说法是这样的: List<Integer> myList = createEmptyList(); // Compiles List myList=createEmptyList();

我定义了一个Java函数:

static <T> List<T> createEmptyList() {
    return new ArrayList<T>();
}
静态列表createEmptyList(){
返回新的ArrayList();
}
有一种说法是这样的:

List<Integer> myList = createEmptyList(); // Compiles
List myList=createEmptyList();//汇编
为什么我不能显式地传递泛型类型参数来调用它

Object myObject = createEmtpyList<Integer>(); // Doesn't compile. Why?
Object myObject=createEmtpyList();//不编译。为什么?

我从编译器中得到错误
表达式的非法开始

如果将类型作为方法参数传入,则可以

static <T> List<T> createEmptyList( Class<T> type ) {
  return new ArrayList<T>();
}

@Test
public void createStringList() {
  List<String> stringList = createEmptyList( String.class );
}
@保尔多 是的,你说得很对。这是java泛型imho的弱点之一

我对Cheekysoft的回应是,我想建议也看看Java人自己是如何做到这一点的,比如T[](T[]a)。我认为Cheekysofts版本更优越,但Java版本具有熟悉性的优势

编辑:添加链接。 重新编辑:在SO上发现错误:)


Cheekysoft的后续行动: 由于它是一个应该返回的某种类型的列表,相应的示例应该如下所示:

static <T> List<T> createEmptyList( List<T> a ) {
  return new ArrayList<T>();
}
静态列表createEmptyList(列表a){
返回新的ArrayList();
}

但是,传递类对象显然是更好的方法。我唯一的论点是熟悉,在这个例子中,它没有多大价值(事实上是不好的)。

当java编译器无法自行推断静态方法的参数类型时,您总是可以使用完全限定的方法名:Class来传递它类型>方法()

对象列表=集合。空列表();

Cheekysoft解释了原因,但如果您确实觉得需要添加第二个类型def,只需在静态函数调用之前添加类名:List myList=MyClass.createEmptyList()-1这是一种常见的误解,即当没有其他参数允许编译器推断泛型类型时,需要将类文本传递到泛型方法中。真正需要的是中提到的语法。无论如何,正如前面提到的,当一个新的泛型对象被立即分配给一个变量时,没有真正的用例来指定它的类型参数——从那时起,即使在编译时,只有该变量的类型才起作用。这就是Java 7的
语法背后的原因。您不使用参数
type
,因此不应该传递它。这将发出警告“type is never used”,因此最好让自动编译类型推断发生对于非静态方法,您可以使用this关键字:
Object list=this。空列表()
static <T> List<T> createEmptyList( List<T> a ) {
  return new ArrayList<T>();
}
Object list = Collections.<String> emptyList();