一种非常“怪异”的包含两层generic返回Class类型的写法

其实这并不怪异,只是一般情况下用不到这种写法。这个东西的标准名称为“泛型方法”。极少数情况,我们需要返回一个List<?>的class type。

@Override
public Class<List<MobileRowData>> getPresentationType() {
    return (Class<List<MobileRowData>>) Collections.<MobileRowData>emptyList().getClass();
}

以后遇上这样的东西,就可以这样写。


如果你去看了Collections.emptyList()方法的源代码(JDK1.7.0_80),你就会发现一些非常有用的信息。源代码如下:

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

方法声明中的第一行中第一个<T>表示这个emptyList方法声明、方法体、方法参数列表中会用到这个<T>。如果T是String,那么就可以将上述源代码看成:

public static final List<String> emptyList() {
    return (List<String>) EMPTY_LIST;
}

当然,上面的代码只是给你解释如果<T>是String时,<T> List<T> emptyList()的等效代码,从功能上看两段代码并不等效。也就是说,<T> List<T> emptyList()给了开发人员在调用emptyList()方法时指定泛型的机会。而LIst<String> emptyList()这种声明方式没有留机会给开发人员在其调用emptyList()方法时设置泛型。

开发人员在调用emptyList()方法时可以用如下这种方式指定<T>:

Collections.<String>emptyList();  //返回 List<String>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章