Java 在返回语句中使用泛型

Java 在返回语句中使用泛型,java,Java,考虑代码: public List<Products> listProducts(){ ... return (List<Products>) query.list(); // returning a list containing Products objects } 除了一些关于原始类型的编译器警告之外,不会有任何问题。如果基础类型不一致,可能会发生一些有趣的事情。假设这种情况: public static ArrayList<St

考虑代码:

public List<Products> listProducts(){

    ...

    return (List<Products>) query.list(); // returning a list containing Products objects
    }

除了一些关于原始类型的编译器警告之外,不会有任何问题。如果基础类型不一致,可能会发生一些有趣的事情。假设这种情况:

public static ArrayList<String> foo() {
    ArrayList<String> arrlist = new ArrayList<String>();        
    arrlist.add("asdf");
    return arrlist;
}

public static List<Integer> bar() {
    return (List)foo();
}

public static void main(String[] args) {

    List<Integer> list = bar();     
    System.out.println(list.get(0).doubleValue());
}
publicstaticarraylistfoo(){
ArrayList arrlist=新的ArrayList();
添加(“asdf”);
返回列表;
}
公共静态列表栏(){
返回(列表)foo();
}
公共静态void main(字符串[]args){
List=bar();
System.out.println(list.get(0.doubleValue());
}
导致运行时异常:

线程“main”java.lang.ClassCastException中的异常: 无法在处将java.lang.String转换为java.lang.Integer test.test.main(test.java:13)

现在,如果您使用:

public static List<Integer> bar() {
    return (List<Integer>)foo();
}
公共静态列表栏(){
返回(列表)foo();
}
编译器可能会抱怨:

Type mismatch: cannot convert from ArrayList<String> to List<Integer>
类型不匹配:无法从ArrayList转换为List
结论:使用泛型总是一个好主意,因为它可以为您节省一些运行时的麻烦

public static ArrayList<String> foo() {
    ArrayList<String> arrlist = new ArrayList<String>();        
    arrlist.add("asdf");
    return arrlist;
}

public static List<Integer> bar() {
    return (List)foo();
}

public static void main(String[] args) {

    List<Integer> list = bar();     
    System.out.println(list.get(0).doubleValue());
}
public static List<Integer> bar() {
    return (List<Integer>)foo();
}
Type mismatch: cannot convert from ArrayList<String> to List<Integer>