为什么编译器允许我将 Pair<String, String> 类型的对象添加到 Pair<String,Integer> 列表中?

问题描述 投票:0回答:1

我使用 Pair 类来存储有关体育场的信息,即体育场的名称及其容量。 让我们看一下第一个例子。我创建一个列表并用参数化类型 Pair 的实例填充它(第 1,2 行)。如果我显式创建另一个参数化类型 Pair(第 3 行)的实例,请将其存储在变量中并尝试将其添加到列表中,编译器会抛出一个错误,即一切都应该是这样的(第 4 行)。但是,如果我删除第 2,3 行并直接在 add 方法中创建 Pair 实例(第二个示例),则程序将被编译并执行。谁能解释一下为什么编译器没有抛出错误?

第一个示例(按预期工作)

      List<Pair<String, Integer>> stadiums = new ArrayList<>();
1.    stadiums.add( new Pair("Bridgeforth Stadium", 25000));
2.    stadiums.add( new Pair("Michigan Stadium", 109901));

3.    Pair<String, String> stringPair =  new Pair("Lane Stadium", "some str value");
4.    stadiums.add(stringPair); // **Required type:Pair<String,Integer> Provided:Pair<String,String>**


第二个例子(有问题)

     List<Pair<String, Integer>> stadiums = new ArrayList<>();
     1. stadiums.add( new Pair("Bridgeforth Stadium", 25000));
     2. stadiums.add( new Pair("Michigan Stadium", 109901));

     5.    stadiums.add( new Pair("Lane Stadium", "some str value"));

在我看来,我需要创建一个参数化类型的变量(正如我上面指出的)才能使编译器正常工作。但我想了解为什么会这样。

java generics
1个回答
0
投票

当您编译代码(任何版本)时,您将收到未经检查的类型警告,告诉您正在做一些危险的事情,可能会导致类型错误。你猜怎么了?事情正在发生。

代码的正确版本始终是这样写的

stadiums.add(new Pair<>("Lane Stadium", "some str value"));

<>
。如果没有
<>
,您就是在告诉编译器不要担心
Pair
到底是什么类型,并且它会忠实地执行您的指令,不用担心。

如果您有一个泛型类型,即使用

<...>
定义的类型(如
class Pair<A, B>
),那么基本上每次您引用
Pair
时,它都应该是
Pair<something, something>
。 (少数例外包括
Pair.class
import foo.bar.Pair;
。)

© www.soinside.com 2019 - 2024. All rights reserved.