繁体   English   中英

对Java规范中的泛型子类型感到困惑吗?

[英]Confusion over generics subtyping in java specs?

我正在阅读Java规范https://docs.oracle.com/javase/specs/jls/se10/html/jls-4.html#jls-4.10.2 ,此行使我感到困惑:

D<U1 θ,...,Uk θ> ,其中D<U1,...,Uk>是泛型,它是泛型C的直接超类型,而θ是替换[F1:= T1,。 ..,FN:= Tn的]。

Uk θ在这里铸造吗? 并且替换D成为D<(U1)T1,...,(Uk)Tk> 如果是这样,为什么笔者省略括号Uk θ铸造语法的一部分? 谢谢!

不投 这是用来描述类型的数学语言。

在代码中,这意味着:

interface D<A, B> {}
interface C<A, B> extends D<A, B> {}

class Y implements D<String, Number> {}
class X implements C<String, Integer> {} // Note Integer is a subtype of Number

然后编译:

D d = new X();

给定通用类型声明C<F1,...,Fn> (n> 0),则参数化类型C<T1,...,Tn>的直接超类型其中Ti(1≤i≤n)为类型,以下所有内容:

D<U1 θ,...,Uk θ> ,其中D<U1,...,Uk>是泛型,它是泛型C<F1,...,Fn>的直接超类型,θ为替换[F1:= T1,...,Fn:= Tn]。

让我们来看一个例子。

public class D<U1,U2> {
}

//Note the order of F3,F4.
class C<F1,F2,F3,F4> extends D<F4,F3>{

}

class Main{

    public static void main(String[] args) {

        C<Integer,String,Float,Number> obj = new C<>();

        D<Float ,Number> obj2 = obj; // Compilation error

        D<Number ,Float> obj3 = obj; //This is fine


    }
}

您认为θ在这里?

θ = [F1:=整数,F2:=字符串,F3:=浮点,F4:=数字]

现在D<Number,Float>是正确的超类型。 但不是D<Float,Number> 为什么呢

由于Ui θ 那么这是什么意思 ?

好吧,这仅表示替代,即扫描U1 , U2 , ... till Uk ,如果找到任何Fi ,则将其替换为Ti

在我们的示例中,这意味着扫描D类的F4F3 。您在θ中有F4F3吗? 是。 然后, D F4F3 必须θ所定义。

注意 :答案是根据我的理解。 关于Java类型语义中Uk θ含义,我没有任何具体参考。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM