-1

通常,在期望其子类型的值的地方传递超类型的值是错误的。

编辑:举个例子(虽然它很奇怪)

interface Testing{
    void printValue(TestClient cl);
}

class TestClient implements Testing{

    private String content;
    public TestClient(String content){
        this.content = content;
    }
    @Override
    public void printValue(TestClient cl) {
        // TODO Auto-generated method stub
        System.out.println((cl.content!=null ?cl.content :"Hello World"));
    }

}

public class Test{
    public static void main(String args[]) {
        Testing t = new TestClient("Hi Friends");
        Testing t1 = new TestClient("Hi Enemies");

        t1.printValue(t);  // generates error (The method printValue(TestClient) in the type Testing is not applicable for the arguments (Testing)
    }
}

在这里,t1.printValue(t)方法产生错误The method printValue(TestClient) in the type Testing is not applicable for the arguments (Testing)

但是在泛型中,每个参数化类型都是相应原始类型的子类型,因此可以将参数化类型的值传递到期望原始类型的地方。

那么,为什么 Java 允许在需要参数化类型的地方传递原始类型的值——但是,它通过生成未经检查的转换警告来标记这种情况。

4

2 回答 2

2

允许向后兼容为 Java 1.4 或在泛型可用之前编写的代码/库。有关详细信息,请参阅Java 中泛型中擦除的概念是什么?和(可能)http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.8

于 2013-09-09T13:48:36.853 回答
0

这是为了向后兼容。printList(List l)想想一个像这样调用的遗留方法:

List l = ...

printList(l);

现在您将方法更改为printList(List<?> l). 如果您不允许调用接受原始类型(在这种情况下禁用类型检查),您将破坏调用代码。

这是 Java 开发人员必须面对的一种情况,因此允许传递原始类型。

另一个原因是由于类型擦除,该方法的原始类型版本在运行时仍然存在。

于 2013-09-09T13:49:45.603 回答