Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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类型转换和变量类型分配_Java_Types_Casting - Fatal编程技术网

Java类型转换和变量类型分配

Java类型转换和变量类型分配,java,types,casting,Java,Types,Casting,我知道标题很奇怪,我不知道还能写什么。我对java比较陌生,所以如果这是一个非常基本的问题,我很抱歉。我已经尽力通过代码来解释这一点。 这里的问题是—— 这就汇编了, //方法1 Map myMap=(Map)new myMap(); 这不是, //方法2 Map myMap2=(Map)new MyMap(); 首先,为什么会有这样的行为。其次,方法2允许我以方法WhatIWant的形式在一行中编写所需代码,而方法1不允许,同样以方法WhatIWant的形式编写。我能把代码写在一行吗?如果

我知道标题很奇怪,我不知道还能写什么。我对java比较陌生,所以如果这是一个非常基本的问题,我很抱歉。我已经尽力通过代码来解释这一点。 这里的问题是——

这就汇编了,

//方法1
Map myMap=(Map)new myMap();
这不是,

//方法2
Map myMap2=(Map)new MyMap();
首先,为什么会有这样的行为。其次,方法2允许我以方法WhatIWant的形式在一行中编写所需代码,而方法1不允许,同样以方法WhatIWant的形式编写。我能把代码写在一行吗?如果是,如何进行。若否,原因为何

import java.util.LinkedHashMap;
导入java.util.Map;
导入java.util.stream.collector;
//一个不是我创建的类,但是在一个库中,所以我不能使用泛型类型,因为我不能在这里更改内容
类MyMap扩展了LinkedHashMap{
}
//有我需要在myMap上处理的方法
类MyType{
int myMethod(){
返回-1;
}
}
课堂擦伤{
公共静态void main(最终字符串[]args)引发异常{
//方式1:
//汇编
//警告:未选中的分配:“java.util.Map”到“java.util.Map”
Map myMap=(Map)new myMap();
//方式2:
//不编译
//错误:不可转换类型;无法将“MyMap”大小写为“java.util.Map”
Map myMap2=(Map)new MyMap();
}
公共静态void WhatIWant(){
//能够在一行中编写下面的代码
Map myMap=(Map)new myMap();
myMap.entrySet().stream()
.collect(collector.toMap)(
entry->entry.getKey().toString(),
entry->entry.getValue().myMethod()
));
//我想如果我像这样使用方式2,它会起作用
((映射)新建MyMap()).entrySet().stream()
.collect(collector.toMap)(
entry->entry.getKey().toString(),
entry->entry.getValue().myMethod()
));
//但正如您在上面的方式2中所看到的,它并没有编译,我如何在一行中完成这项工作
}
}
如果你想在“一行”(即1条语句,5行)中使用它,双击它:

((Map<MyType, MyType>) (Map) new MyMap()).entrySet().stream()
        .collect(Collectors.toMap(
                entry -> entry.getKey().toString(),
                entry -> entry.getValue().myMethod()
        ));
((Map)(Map)new MyMap()).entrySet().stream()
.collect(collector.toMap)(
entry->entry.getKey().toString(),
entry->entry.getValue().myMethod()
));
第一次强制转换使用原始
映射
,因此将丢弃
泛型类型参数。这对于向后兼容性是有效的,但会生成一个编译器警告,说明您不应该这样做:

Map
是原始类型。对泛型类型
Map
的引用应参数化

然后,第二个强制转换应用一组新的泛型类型参数。这对于向后兼容性是有效的,但确实会生成一个编译器警告,说明您是自己的,因为通用参数类型不强制执行:

类型安全:未选中从
Map
Map


无法直接强制转换的原因是
Map
不是
Map
的子类型,也就是说,它在Java类型系统中是不可能强制转换的。请参见

您需要在类中进行一些更改以解决问题

// instead Object use your own type
    class MyMap extends LinkedHashMap<MyType, MyType> {
    }

只是一个问题。。。。为什么要在空映射上迭代?如果您刚刚创建了新的myMap对象,它将没有任何元素。为什么需要
myMap
类。为什么不直接使用
LinkedHashMap
。这些不是实际的类。有一个类库,它的类具有相似的类型。MyMap和MyType是库类。@Eran有一个库,它有自己的类型类似于MyMap。它有一个我使用的返回MyMap的方法。因此,我只能决定如何使用它,而不能对现有库进行更改。MyMap和MyType是库类,我不能碰它们。我所能做的就是决定如何使用它们。我不能对它们做任何更改。
Map<MyType, MyType> myMap2 = new MyMap();
new MyMap().entrySet().stream()
                .collect(Collectors.toMap(
                        entry -> entry.getKey().toString(),
                        entry -> entry.getValue().myMethod()
                ));