Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我能够将Long传递给Map.get()方法,而该方法没有设置Long键_Java_Generics - Fatal编程技术网

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
takes
Object
不是映射的泛型类型。仅供参考,术语
type erasure
具有非常特定的含义,这与运行时行为WRT泛型有关。您在这里使用的术语有误导性。@JohnB谢谢,类型擦除在我的脑海中模糊了一会儿。仅供参考,
type erasure
这个术语有一个非常具体的含义,这与WRT泛型的运行时行为有关。您在这里使用的术语有误导性。@JohnB谢谢,类型擦除在我的脑海中模糊了一会儿。仅供参考,
type erasure
这个术语有一个非常具体的含义,这与WRT泛型的运行时行为有关。您在这里使用的术语有误导性。@JohnB谢谢,类型擦除在我的脑海中模糊了一会儿。仅供参考,
type erasure
这个术语有一个非常具体的含义,这与WRT泛型的运行时行为有关。你在这里使用这个词有误导性。@JohnB谢谢