当前位置: 首页 > 知识库问答 >
问题:

MethodReference表达式的简化过程

柯星辰
2023-03-14

从JLS中考虑下面的文章,它描述了在类型推断过程中方法引用表达式的还原过程。

形式的约束公式,其中T提到至少一个推理变量,减少如下:

...

否则,如果方法参考准确(§15.13.1),则让P1。。。,Pn是T的函数类型的参数类型,让F1。。。,Fk是潜在适用方法的参数类型。该约束减少为一组新的约束,如下所示:

–在n=K1的特殊情况下,P1类型的参数将作为调用的目标引用。方法引用表达式的形式必须为ReferenceType::[TypeArguments]标识符。约束降低到èP1

在所有其他情况下,n=k,对于所有i(1),约束减少到≤ 我≤ n) ,èPi→ Fi›。

在这里,我想知道一些关于如何在条款中假设和适应以下条件的例子:

  • 泛型函数类型
  • 通用类类型(其方法将被用作参考)
  • 通用方法类型(将作为参考)

例如,以下是我根据解释提出的问题:

  • P1。。。,Pn是T的函数类型的参数类型,让F1。。。,Fk是潜在适用方法的参数类型
FunctionType<P1,P2 ... Pn> funType = ClassCls::MethodRef;
...
class ClassCls {
...
 public static <F1, ..., Fk> RetType potentiallyApplicbMethod(...){}
}
  • 现在我们来看n=k1
    • 为什么FunctionType的参数数量比潜在应用方法的参数数量多
    • 为什么P1要充当调用的目标引用?我猜这里P1被假定为潜在应用方法的返回类型(RetType
    • 我假设当FunctionType中指定的所有类型(可能包括也可能不包括返回类型)与潜在应用方法中指定的所有类型完全匹配时,就会给出这种情况

共有1个答案

诸葛绍元
2023-03-14
匿名用户

为什么FunctionType的参数数比可能的应用程序方法多?

方法引用有不同的形式。其中一种形式是ReiscceType::Instancemethod,或者Java教程称之为“引用特定类型的任意对象的实例方法”。

例子:

public class Main {

    public static void main(String[] args) {
        // this is a "reference to an instance method of an arbitrary object of a particular type"
        BiConsumer<Main, String> bar = Main::foo;
    }

    private <T> void foo(T t) {

    }
}

显然,BiConsumer的函数类型有两个参数,但是foo只有一个参数。函数类型的第一个额外参数是必需的,因为您需要一个实例来调用foo,而我们尚未在方法引用Main::foo中指定该实例<代码>条形图。accept(new Main(),“foo”)与调用new Main()相同。foo(“foo”)。这就是JLS所说的“目标引用”——它是您调用方法的对象。它与返回类型无关。

现在您也应该能够理解为什么JLS说,在n=k1的情况下,方法引用必须是引用Type:: [TypeArguments]标识符的形式,而不是主:: [TypeArguments]标识符

对于n=k的情况,我假设当FunctionType中指定的所有类型与为潜在应用方法指定的所有类型完全匹配时,给出了这一点?

不,这个案例只是指其他类型的方法引用:

  • 对静态方法的引用

 类似资料:
  • 我在《朱莉娅》中使用了符号学软件包,它似乎没有简化表达式的派生。 例如: 结果 如果我改为手工创建派生表达式,那么simplify非常有用 给予 正如预期的那样。 为什么simplify不能正确处理由微分创建的表达式?

  • 如何简化这个正则呢? 或者是否有其他实现方式(正则)?

  • 过滤表达式 mitmproxy工具中的许多命令都使用过滤器表达式。过滤器表达式由以下运算符组成: 命令 描述 〜a 匹配响应资源:CSS,Javascript,Flash,images。 〜b regex Body 〜bq regex 请求的Body 〜bs regex 响应的Body 〜c int HTTP响应码 〜d regex 域名 〜dst regex 匹配目标地址 〜e 匹配错误 〜h

  • 主要内容:实例,为什么使用正则表达式?,发展历史,应用领域除非您以前使用过正则表达式,否则您可能不熟悉一些术语。但是,毫无疑问,您已经使用过不涉及脚本的某些正则表达式概念。 例如,您很可能使用 ? 和 * 通配符来查找硬盘上的文件。? 通配符匹配文件名中的 0 个或 1 个字符,而 * 通配符匹配零个或多个字符。像 data(\w)?\.dat 这样的模式将查找下列文件: 使用 * 字符代替 ? 字符扩大了找到的文件的数量。data.*\.dat 匹配下

  • 你,对,就是你,正在看这篇文章的人,我虽然不认识你,但是 我可以负责任的说, 如果你看到这个标题就心里在悄悄的呼喊: “靠,他们连这个都有!我省事了,哇哈哈哈和”。 那么,你绝对属于百分之一的特例。 就是说,绝大多数人的绝大多数项目,是不需要 一个嵌入式的表达式引擎的。因此,提供这个功能的目的就是: 满足一小撮人的一小撮要求 但是,"一小撮人"的"一小撮要求"有很多,作为一个小众类库,为什么单单打

  • 正则表达式是一系列的字符串。这些包含超过其字面含义的字符串被称之为元字符。例如,一个符号前面的引用符代表一个人的言语能力,或者按照上面的说法,代表着meta-meaning[1]。正则表达式是一组字符串和(或者)一组匹配(特定的)模式的元字符。 一个正则表达式包含下面的一个或多个选项: 一组字符串。这是仅仅表示字面意思的字符串。最简单形式的正则表达式仅仅包含一组字符串。 一个锚字符。锚节点指定了正