gpt4 book ai didi

java - 在 Java 中支持协变类型转换

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:31:51 25 4
gpt4 key购买 nike

Java 类型系统只支持不变类型。所以一个List<String>不是 List<Object> . List<String>不是 List<Object>因为插入 Integer 无效进入List<String> .但是,对于某些类型,此类协变类型转换是有效的。

给定类 A、B 和生产者:

class A{}
class B{}
interface Producer<T> {
T next();
}

可以定义协变类型 Producer 的转换:

class Types{
@SuppressWarnings("unchecked")
public static <T> Producer<T> cast(Producer<? extends T> producer){
return (Producer<T>) producer;
}
}

此方法支持从Producer<A> 转换至 Producer<Object>并防止像 Producer<A> 这样的无效转换至 Producer<B> :

Producer<Object> valid = Types.<Object> cast(new Producer<A>());
Producer<A> invalid = Types.<A> cast(new Producer<B>()); //does not compile

我的问题是我无法执行来自 Producer<Producer<A>> 的转换至 Producer<Producer<Object>> .

Producer<Producer<A>> producerOfA = new Producer<Producer<A>>();
Producer<Producer<Object>> producerOfObjects =
Types.<Producer<Object>> cast(producerOfA); //does not compile

有没有办法说服 Java 类型系统执行这种有效的类型转换而不在用户代码中发出警告?

最佳答案

您还没有发布 Producer 的代码,但是根据名称和您断言它应该是协变的,也许在您当前所说的任何地方:

Producer<Foo>

你应该说:

Producer<? extends Foo>

如果 Java 能够自动意识到通用接口(interface)与其通配符形式等价(例如,IteratorIterable 也是安全协变的),那就太好了,但是至少现在,它没有。

关于java - 在 Java 中支持协变类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1564537/

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