为什么可以';我是否显式地将类型参数传递给泛型Java方法?
我定义了一个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();
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();