gpt4 book ai didi

Java 类型转换和变量类型赋值

转载 作者:行者123 更新时间:2023-11-30 01:42:22 25 4
gpt4 key购买 nike

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

编译成功,

// WAY 1
Map<MyType, MyType> myMap = (Map) new MyMap();

这不是,

// WAY 2
Map<MyType, MyType> myMap2 = (Map<MyType, MyType>) new MyMap();

首先,为什么会有这样的行为。其次,方法 2 允许我在一行中编写我想要的代码,如方法 WhatIWant 中所写,而方法 1 则不允许,同样如方法 WhatIWant 中所写。我可以将该代码写在一行中吗?如果是,如何。如果没有,为什么不呢。

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Collectors;

// A class not created by me but in a library so i cannot use generic types as i cannot change stuff here
class MyMap extends LinkedHashMap<Object, Object> {
}

// has methods which i need for processing on myMap
class MyType {
int myMethod() {
return -1;
}
}

class Scratch {
public static void main(final String[] args) throws Exception {
// WAY 1:
// compiles
// WARNING : Unchecked assignment: 'java.util.Map' to 'java.util.Map<MyType, MyType>'
Map<MyType, MyType> myMap = (Map) new MyMap();

// WAY 2:
// does not compile
// ERROR: Inconvertible types; cannot case 'MyMap' to 'java.util.Map<MyType, MyType>'
Map<MyType, MyType> myMap2 = (Map<MyType, MyType>) new MyMap();
}

public static void WhatIWant() {
// to be able to write code below in one line
Map<MyType, MyType> myMap = (Map) new MyMap();
myMap.entrySet().stream()
.collect(Collectors.toMap(
entry -> entry.getKey().toString(),
entry -> entry.getValue().myMethod()
));

// I thought it would work if i used WAY 2 like
((Map<MyType, MyType>) new MyMap()).entrySet().stream()
.collect(Collectors.toMap(
entry -> entry.getKey().toString(),
entry -> entry.getValue().myMethod()
));
// but as you saw above in WAY 2, it does not compile, how can i do this in one line
}
}

最佳答案

如果您希望它在“一行”中(又名 1 个语句,5 行),双重转换它:

((Map<MyType, MyType>) (Map) new MyMap()).entrySet().stream()
.collect(Collectors.toMap(
entry -> entry.getKey().toString(),
entry -> entry.getValue().myMethod()
));

第一次转换使用原始 Map ,所以<Object, Object>泛型类型参数被丢弃。这对于向后兼容性是有效的,但会生成编译器警告,指出您不应该这样做:

Map is a raw type. References to generic type Map<K,V> should be parameterized

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

Type safety: Unchecked cast from Map to Map<MyType,MyType>

无法直接转换的原因是 Map<MyType,MyType>不是 Map<Object,Object> 的子类型,即在 Java 类型系统中这是不可能的转换。请参阅Is List<Dog> a subclass of List<Animal> ? Why are Java generics not implicitly polymorphic?

关于Java 类型转换和变量类型赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59530510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com