带有无效类的Java泛型类型get调用不会导致编译器错误
为什么这个Java代码没有生成任何编译器错误带有无效类的Java泛型类型get调用不会导致编译器错误,java,generics,compiler-errors,Java,Generics,Compiler Errors,为什么这个Java代码没有生成任何编译器错误 Map<String, String> m = new HashMap<String, String>(); m.get(1); Map m=newhashmap(); m、 get(1); 我试图在映射字符串的映射中找到一个整数。这显然是一个编程错误 类似地,此代码也不会生成错误: Map<Integer, String> m = new HashMap<Integer, String>(); m
Map<String, String> m = new HashMap<String, String>();
m.get(1);
Map m=newhashmap();
m、 get(1);
我试图在映射字符串的映射中找到一个整数。这显然是一个编程错误 类似地,此代码也不会生成错误:
Map<Integer, String> m = new HashMap<Integer, String>();
m.get("dd1");
Map m=newhashmap();
m、 获取(“dd1”);
所以Java编译器似乎并没有检查Map.get(Object)方法的参数类型。有什么想法吗?
Map
接口get
方法将Object
作为参数
两种情况下都没有错误。唯一的问题是它必须是一个对象,如果equals方法对传递的对象满意,则返回值。
Map
interfaceget
方法将Object
作为参数
两种情况下都没有错误。唯一的问题是它必须是一个对象,如果equals方法对传递的对象满意,则返回值。通常在插入时进行检查。在
put
方法中
如果在
map
中没有插入错误的数据,则在使用get
方法获取数据时无需进行检查通常在插入时进行检查。在put
方法中
如果在
映射中没有插入错误的数据,则在使用获取
方法获取数据时无需进行检查它将检查put操作和返回值(public V get(对象键)),而不是所有操作。它将检查put操作和返回值(public V get(对象键)),不是所有的动作。m.get(对象)这里的代码>参数对地图中的任何对象类型都有效。这样就不会给您带来编译错误。m.get(Object)这里的代码>参数对地图中的任何对象类型都有效。因此,这不会给您带来编译错误。正如您在()的文档中所看到的,get方法不使用泛型注入,而是使用对象作为输入参数。因此,您将在运行时得到一个ClassCastException。这与使用泛型类型注入的put方法不同。正如您在()的文档中所看到的,get方法不使用泛型注入,而是使用对象作为输入参数。因此,您将在运行时得到一个ClassCastException。这与使用泛型类型注入的put方法不同
Java编译器似乎没有检查Map.get(Object)方法的参数类型
当然有。它会检查它是否是一个对象。
没有其他需要检查的内容。存在“无效类”的唯一方法是使用基元类型
Java编译器似乎没有检查Map.get(Object)方法的参数类型
当然有。它会检查它是否是一个对象。
没有其他需要检查的内容。存在“无效类”的唯一方法是使用基元类型。还可以查看“这显然是编程错误”。不,不是。一个类的对象可以等于另一个类的对象。整数和字符串恰好不是这种情况,但一般情况下也会发生。另外,请看一看“这显然是编程错误”。不,不是。一个类的对象可以等于另一个类的对象。对于整数
和字符串
,情况恰好不是这样,但它可以在一般情况下发生。它与泛型没有任何关系。1998年也是如此。参数是一个对象,
它被检查为对象。
@EJP我的意思是,例如,如果OP使用get(T)
,那么他可能会意识到将其作为对象的好处。我的第一点提到了你所说的。没有什么是get(T)。
这个方法被定义为get(Object)。
@EJP,其中T是Object,我的句子可能会误导。刚刚编辑过,你在拐弯抹角。这不仅仅是“误导”,而是错误的。没有T,
也没有泛型。它与泛型没有任何关系。1998年也是如此。参数是一个对象,
它被检查为对象。
@EJP我的意思是,例如,如果OP使用get(T)
,那么他可能会意识到将其作为对象的好处。我的第一点提到了你所说的。没有什么是get(T)。
这个方法被定义为get(Object)。
@EJP,其中T是Object,我的句子可能会误导。刚刚编辑过,你在拐弯抹角。这不仅仅是“误导”,而是错误的。没有T,
也没有泛型。“所以在运行时你会得到一个ClassCastException。”不,你不会。不可能。阅读get
方法的契约。“因此,您将在运行时获得ClassCastException。”不,您不会。不可能。阅读get
方法的合同。问题与put
无关问题与put