gpt4 book ai didi

java - 泛型的细微差别

转载 作者:行者123 更新时间:2023-11-30 07:09:13 24 4
gpt4 key购买 nike

  class P {

}
class Q extends P {

}
class R extends Q {

}
class S extends R {

}

public class Manager {

public static void main(String[] args) {

X<? super R> x4 = null;
x4.test(new S());
x4.test(new R());
x4.test(new P());//compile time error

}
}

class X<A> {
void test(A obj) {

}
}

最佳答案

以下是来自 JLS 的一些规则

A type argument T1 is said to contain another type argument T2, written T2 <= T1, if the set of types denoted by T2 is provably a subset of the set of types denoted by T1 under the reflexive and transitive closure of the following rules (where <: denotes subtyping (§4.10)):

? super T <= ? super S if S <: T

? super T <= ?

? super T <= ? extends Object

T <= ? super T

符号

X<? super R> x4 = null;

声明X使用下限为 R 的通用通配符类型参数.

根据上述规则和您对变量的声明,我们可以确定通配符涵盖了 R 的所有子类型。和 R本身。 SR 的子类型, RR , P不是 R 的子类型.

困惑可能来自以下。你可以做

X<? super R> x4 = new X<P>();

PR 的父类(super class).但是,当你想使用类的类型参数时 X , 你所知道的是它必须至少是一个 R .

进一步阅读:

关于java - 泛型的细微差别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23329152/

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