假设我有一个Message
班和一个Channel<T : Message>
班.
现在,为什么我不能在没有未经判断的施法警告的情况下使用Channel<out Message>
到Channel<Message>
的法术呢?
既然Channel<out Message
只能包含Message
类型的对象或Message
类型的子类,那么这个强制转换不应该总是安全的吗?
假设我有一个Message
班和一个Channel<T : Message>
班.
现在,为什么我不能在没有未经判断的施法警告的情况下使用Channel<out Message>
到Channel<Message>
的法术呢?
既然Channel<out Message
只能包含Message
类型的对象或Message
类型的子类,那么这个强制转换不应该总是安全的吗?
不,这就是证据.
class Channel<T : Message> {
fun send(t: T)
fun receive(): T
}
class Apple : Message()
class AppleChannel : Channel<Apple>() {
...
}
val appleChannel = AppleChannel()
val outMessageChannel: Channel<out Message> = appleChannel // MUST WORK
val messageChannel: Channel<Message> = outMessageChannel
// you say this should work, but...
messageChannel.send(Orange())
// sending orange on a channel that only knows how to send apples!
// Error!
在这种情况下,唯一一致的做法是不允许将Channel<out Message>
转换为Channel<Message>
.
如果将其定义为Channel<out T: Message>
,则这将是安全的,但try 定义send
将导致错误.