泛型,传递错误的类型?

时间:2016-06-27 12:53:26

标签: java generics

最后两个陈述有什么区别?为什么一个陈述有效,另一个陈述不起作用?

package Main;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {

    public static void printIt(List<Object> l)
    {
        System.out.println(l);
    } 

    public static void main(String[] args) {
        List<String> l =new ArrayList<>();
        l.add("A");

        //what is the differance between the following statments ? 

        printIt(Arrays.asList("A")); // it compiles successfully
        printIt(l); // it does not compile

    }
}

4 个答案:

答案 0 :(得分:4)

问题是printIt()方法期望List<Object>作为参数,但我们将List<String>传递给它,这就是编译问题的原因。 替换方法printIt()中的参数List,如下所示:

    public static void printIt(List<? extends Object> l)
    {
        System.out.println(l);
    }

现在两人都会编译,

答案 1 :(得分:3)

这是因为您的方法需要List<Object>并且您给它List<String>

第一次阅读本文时可能会出现奇怪现象,List<String>不是List<Object>

在您的示例中,您不会修改列表的内容,但让我们想象一下您要添加新元素的方法。

public static void addIt(List<Object> l, Object o)
{
    l.add(o);
} 
public static void main(String[] args) {
    List<String> l =new ArrayList<>();
    l.add("A");
    addIt(l, new Integer(1)); // What?! you want to add an Integer to a List<String>!!!!
}

您必须使用通配符(?)或解决您的问题以便列出您的问题。

public static void printIt(List<?> l) //or printIt(List<? extends Object> l)
{
    System.out.println(l);
} 

printIt(Arrays.asList("A"))的情况略有不同。这是因为泛型是通过type inference在泛型方法上动态确定的。

List<Object> l = Arrays.asList("A"); //this is valid, the generic type is determined from the type we expect in this declaration.

答案 2 :(得分:2)

为了帮助您理解这一点,这是另一个编译代码示例,它演示了来自返回类型的类型推断:

24/02/2016

答案 3 :(得分:0)

所以@csharpfolk提到它是关于&#34; Type Inference&#34;!
以下文件可能有助于理解背后的想法!

https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html