Java 为什么我能够将Long传递给Map.get()方法,而该方法没有设置Long键
我在泛型中遇到了一些古怪的行为,我想知道是否有人能解释为什么会发生这种情况。首先,我有一个类Java 为什么我能够将Long传递给Map.get()方法,而该方法没有设置Long键,java,generics,Java,Generics,我在泛型中遇到了一些古怪的行为,我想知道是否有人能解释为什么会发生这种情况。首先,我有一个类Foo,它有一个字段id。Foo上的hashCode方法只返回id。在另一个类中,我创建了一个Map bar=newhashmap所以有两件事。首先,请记住,由于类型擦除,没有泛型类型的运行时检查。Map只会变成Map 第二,关于编译器警告或错误,如果bar被声明为Map类型,则应该得到警告或错误。但如果声明为Map,则没有警告或错误。我猜bar被定义为Map bar 更新 在get上没有错误的原因是根据
Foo
,它有一个字段id。Foo
上的hashCode
方法只返回id。在另一个类中,我创建了一个Map bar=newhashmap所以有两件事。首先,请记住,由于类型擦除,没有泛型类型的运行时检查。Map
只会变成Map
第二,关于编译器警告或错误,如果bar
被声明为Map
类型,则应该得到警告或错误。但如果声明为Map
,则没有警告或错误。我猜bar
被定义为Map bar
更新
在get
上没有错误的原因是根据定义get
采用的是对象
而不是泛型类型。这是界面的一个奇怪之处
所以有两件事。首先,请记住,由于类型擦除,没有泛型类型的运行时检查。Map
只会变成Map
第二,关于编译器警告或错误,如果bar
被声明为Map
类型,则应该得到警告或错误。但如果声明为Map
,则没有警告或错误。我猜bar
被定义为Map bar
更新
在get
上没有错误的原因是根据定义get
采用的是对象
而不是泛型类型。这是界面的一个奇怪之处
所以有两件事。首先,请记住,由于类型擦除,没有泛型类型的运行时检查。Map
只会变成Map
第二,关于编译器警告或错误,如果bar
被声明为Map
类型,则应该得到警告或错误。但如果声明为Map
,则没有警告或错误。我猜bar
被定义为Map bar
更新
在get
上没有错误的原因是根据定义get
采用的是对象
而不是泛型类型。这是界面的一个奇怪之处
所以有两件事。首先,请记住,由于类型擦除,没有泛型类型的运行时检查。Map
只会变成Map
第二,关于编译器警告或错误,如果bar
被声明为Map
类型,则应该得到警告或错误。但如果声明为Map
,则没有警告或错误。我猜bar
被定义为Map bar
更新
在get
上没有错误的原因是根据定义get
采用的是对象
而不是泛型类型。这是界面的一个奇怪之处
您的地图
可能已被强制转换为地图
:
Map<Foo, Double> barOriginal = new HashMap<Foo, Double();
// ...
Map bar = barOriginal;
// ...
Long baz = new Long(1);
bar.put(baz, new Double(1));
Map barOriginal=newhashmap您的Map
可能已被强制转换为Map
:
Map<Foo, Double> barOriginal = new HashMap<Foo, Double();
// ...
Map bar = barOriginal;
// ...
Long baz = new Long(1);
bar.put(baz, new Double(1));
Map barOriginal=newhashmap您的Map
可能已被强制转换为Map
:
Map<Foo, Double> barOriginal = new HashMap<Foo, Double();
// ...
Map bar = barOriginal;
// ...
Long baz = new Long(1);
bar.put(baz, new Double(1));
Map barOriginal=newhashmap您的Map
可能已被强制转换为Map
:
Map<Foo, Double> barOriginal = new HashMap<Foo, Double();
// ...
Map bar = barOriginal;
// ...
Long baz = new Long(1);
bar.put(baz, new Double(1));
Map barOriginal=new hashmap在代码中的该点,声明的bar
类型不能与您显示的类型相同。请显示您的Foo类。我不敢相信代码没有给出编译器错误。你确定你没有弄错什么吗?上面添加了相关代码。请参阅我的更新get
获取Object
不是映射的泛型类型。在代码中,声明的bar
类型必须与您显示的类型不同。请显示您的Foo类。我不相信代码没有给出编译器错误。你确定你没有弄错什么吗?上面添加了相关代码。请参阅我的更新get
获取Object
不是映射的泛型类型。在代码中,声明的bar
类型必须与您显示的类型不同。请显示您的Foo类。我不相信代码没有给出编译器错误。你确定你没有弄错什么吗?上面添加了相关代码。请参阅我的更新get
获取Object
不是映射的泛型类型。在代码中,声明的bar
类型必须与您显示的类型不同。请显示您的Foo类。我不相信代码没有给出编译器错误。你确定你没有弄错什么吗?上面添加了相关代码。请参阅我的更新get
takesObject
不是映射的泛型类型。仅供参考,术语type erasure
具有非常特定的含义,这与运行时行为WRT泛型有关。您在这里使用的术语有误导性。@JohnB谢谢,类型擦除在我的脑海中模糊了一会儿。仅供参考,type erasure
这个术语有一个非常具体的含义,这与WRT泛型的运行时行为有关。您在这里使用的术语有误导性。@JohnB谢谢,类型擦除在我的脑海中模糊了一会儿。仅供参考,type erasure
这个术语有一个非常具体的含义,这与WRT泛型的运行时行为有关。您在这里使用的术语有误导性。@JohnB谢谢,类型擦除在我的脑海中模糊了一会儿。仅供参考,type erasure
这个术语有一个非常具体的含义,这与WRT泛型的运行时行为有关。你在这里使用这个词有误导性。@JohnB谢谢