【问题标题】:Confusion over generics subtyping in java specs?对 Java 规范中的泛型子类型感到困惑?
【发布时间】:2018-07-20 02:35:24
【问题描述】:

我正在阅读 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 θ 中的括号?谢谢!

【问题讨论】:

标签: java subtyping


【解决方案1】:

给定一个泛型类型声明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&lt;Number,Float&gt; 是正确的超类型。但不是D&lt;Float,Number&gt;。为什么?

因为Ui θ。那么这是什么意思呢?

好吧,它只是意味着替换,即扫描U1 , U2 , ... till Uk,如果你找到任何Fi,然后将其替换为Ti。

在我们的示例中,它表示扫描 D 类的 F4 和 F3。你在 θ 中有 F4 和 F3 吗?是的。 那么F4,F3 of D必须如θ中定义的那样。

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

【讨论】:

  • 非常感谢!这真的很有意义!我认为只有一点是应该有一个约束k &lt;= n,尽管java doc 没有提到这一点。再次感谢!
  • 好点。连我自己都这么想。但是,如果您注意到,他们会在每个 U1、U2、...、Uk 上应用 θ。这显然意味着 {U1, U2 ,... ,Uk} 是 {F1,F2,..,Fn} 的子集,因为每个 Ui 都必须有一个 F,因为它们都是类型参数而不是类型参数。这意味着 k
  • 你说的很对,k &lt;= n 应该是使用Uk θ 的前提,所以不需要明确指出。
【解决方案2】:

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

在代码中,如果:

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();

【讨论】:

  • 感谢 Bohemian,您的代码非常有见地,但我还是有点困惑。我从另一篇文章中了解到:= 意味着分配。但是我找不到任何关于Uk θ 用法的信息,它可能是某种数学变换符号,但我仍然想知道有没有正式的定义?
  • @mzoz 我非常感谢您的问题和您的关注。我有同样的问题,我也找不到答案。也许我的措辞可以帮助你。 stackoverflow.com/questions/69502823/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
相关资源
最近更新 更多