java - 类级别参数的泛型如何工作

标签 java generics

<分区>

考虑以下来自 Java Puzzlers 的代码

class Gloam<T>{

String glom(Collection<?> objs ) {
    System.out.println("collection");
    String result = "";
    for (Object o : objs ){
        result += o;
    }
    return result;
}

int glom(List <Integer> ints ) {
    System.out.println("List");
    int result = 0;
    for ( int i : ints )
        result += i ;
    return result;
}

public static void main(String[] args) {
    List<String> strings = Arrays.asList("1", "2", "3");
    System.out.println(new Gloam().glom(strings));
}

}

当我运行这个程序时它给出了类转换异常,但是如果我在 main 方法中为 Gloam 类提供任何通用参数它工作正常。

public static void main(String[] args) {
    List<String> strings = Arrays.asList("1", "2", "3");
    System.out.println(new Gloam<Date>().glom(strings));
}

我不明白泛型在类类型参数中是如何工作的?

最佳答案

由于没有将泛型类型传递给构造函数,所有类型都将被删除,并向编译器提供此选择

String glom ( Collection );

int glom ( List );

类型也从 strings 中删除main 中定义的变量, 所以它的类型是 List .

因为 ListCollection 更具体它选择 int glom ( List ) .

现在,如果您指定了通用参数,则不会发生类型删除,并且编译器知道它无法匹配 int glom ( List<Integer> )List<String> , 所以它回落到 String glom ( Collection<?> )

关于java - 类级别参数的泛型如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17749697/

相关文章:

java - 编写数组声明字符串

c# - 如何在 C# 中使用 T 类型进行类型转换并访问其属性和变量

java - 如何通过插件获取当前分支名称

java - Java中 'for'的使用

java - 什么是 PECS(生产者扩展消费者 super )?

Swift Generic 没有按预期进行推断

c# - Azure.Data.Tables通用基类问题

java - 如何创建可变数量的变量?

Java hashcode逆向计算

java - 将图像添加到 ArrayList<BufferedImage> 时出现 Nullpointerexception