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

java 8中的“特定类型的任意对象”是什么意思?

濮阳翔
2023-03-14

在Java8中有“方法引用”特性。其中一种是“对特定类型的任意对象的实例方法的引用”

http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html#type

有人能解释一下在这种情况下“特定类型的任意对象”是什么意思吗?

共有3个答案

郭鸿信
2023-03-14

请参阅下面的代码示例,其中说明了 https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html 中描述的“对特定类型的任意对象的实例方法的引用”类别

import java.util.Arrays;

class Person{
    String name;

    //constructor
    public Person(String name){
        this.name = name;
    }

    //instance method 1
    public int personInstanceMethod1(Person person){
        return this.name.compareTo(person.name);
    }

    //instance method 2
    public int personInstanceMethod2(Person person1, Person person2){
        return person1.name.compareTo(person2.name);
    }
}

class Test {
    public static void main (String[] args) throws Exception{
        Person[] personArray = {new Person("A"), new Person("B")};
    
        // Scenario 1 : Getting compiled successfully
        Arrays.sort(personArray, Person::personInstanceMethod1);
    
        // Scenario 2 : Compile failure
        Arrays.sort(personArray, Person::personInstanceMethod2);
    
        // Scenario 3 : Getting compiled successfully. 
        Person personInstance = new Person("C");
        Arrays.sort(personArray, personInstance::personInstanceMethod2);

        // Scenario 4 : Getting compiled successfully. As the same way as "Scenario 1"
        String[] stringArray = { "Barbara", "James", "Mary", "John",
                                "Patricia", "Robert", "Michael", "Linda" };
        Arrays.sort(stringArray, String::compareToIgnoreCase);
    }

}

场景1和场景4描述了https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html中描述的“对特定类型的任意对象的实例方法的引用”类别

如果方法参数采用与元素的实例Type相同的实例Type中的变量,则可以使用Type调用该实例方法。(Person::人InstanceMethod od1

将“< code>Person”类中的“< code > personinstancemethold 1 ”实例方法与“< code>String”类(https://docs . Oracle . com/javase/8/docs/API/Java/lang/String . html # comparetignorecase-Java . lang . String-)中的“< code > comparetignorecase ”实例方法进行比较,以查看相似之处。两者都采用同一类型的单个参数。

比较场景1和场景2,看看有什么不同。

印宏阔
2023-03-14

它是对某种类型的实例方法的引用。在本例中,compareToIgnoreCaseString 中的一个方法。该程序知道它可以在 String 的实例上调用此方法,因此它可以获取引用和该类型的任何对象,并保证该方法存在。

我将它与< code>Method类进行比较,因为它们引用一个方法,并且可以在某种类型的任意实例上调用。

例如,它可以使用两个< code>String对象,并对其中一个调用< code > comparetignorecase ,将另一个用作匹配方法签名的参数。这允许它获取数组,并基于数组类型的任何方法对其进行排序,而不是要求比较器实例来做这件事。

下面是没有点击问题中链接的人的例子:

String[] stringArray = { "Barbara", "James", "Mary", "John",
"Patricia", "Robert", "Michael", "Linda", "George" };
Arrays.sort(stringArray, String::compareToIgnoreCase);
罗茂实
2023-03-14

Oracle Doc链接中给出的示例是:

String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);

λ相当于

 String::compareToIgnoreCase

会是

(String a, String b) -> a.compareToIgnoreCase(b)

Arrays.sort() 方法正在寻找一个比较器作为其第二个参数(在此示例中)。传递 String::compareToIgnoreCase 创建一个比较器,其中 a.compareToIgnoreCase(b) 作为比较方法的主体。然后你问什么是ab。比较方法的第一个参数变为 a,第二个参数变为 b。这些是字符串(特定类型)类型的任意对象。

你不明白吗?

    < li >确保您知道什么是比较器以及如何实现它。 < li >了解什么是函数接口,以及它如何影响Java中的lambdas。 < li >比较器是一个函数接口,这就是为什么方法引用成为比较器对象中比较方法的主体。 < li >有关页面底部的另一个示例,请阅读下面的源代码。

在源头阅读更多内容:http://moandjiezana.com/blog/2014/understanding-method-references/

 类似资料:
  • 在Java8中有“方法引用”特性。其中一种是“对特定类型的任意对象的实例方法的引用” http://docs.oracle.com/javase/tutorial/java/javao/methodreferences.html#类型

  • 问题内容: 在Java 8中,具有“方法参考”功能。一种是“引用特定类型的任意对象的实例方法” http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html#type 有人可以解释在这种情况下“特定类型的任意对象”是什么意思吗? 问题答案: 它是对某种类型的实例方法的引用。在此示例中,是的方法。程序知道可以在的实例

  • 我正在尝试对函数返回的值发出警报,并且在警报中得到以下信息: 下面是JavaScript代码: 是我试图检查的函数。

  • 问题内容: 任何人都可以确认我是否正确地在下面的方法调用中看到了该参数: 作为对象类型的数组?我不记得以前在Java中见过。 问题答案: 它等效于,但允许调用者一次只指定一个值作为参数,编译器将创建一个数组。所以这个电话: 相当于 有关更多信息,请参见varargs功能的文档(在Java 5中引入)。

  • oracleJava8留档定义了4种类型的方法引用,您可以使用它来代替Lambda表达式。我试图理解的是描述为:“引用特定类型的任意对象的实例方法”的那种方法引用,它被写为。 我不确定我是否错过了什么,但对我来说似乎更像是:“引用函数接口抽象方法的第一个参数,假设它是类型”。我试图提出这个“任意对象”是第二个参数的示例,但当然它不编译。 是否有官方参考编译器如何解析此对象?我的理解是否正确: 任意

  • oracle Java8文档定义了4种可以用来代替Lambda表达式的方法引用类型。我试图理解的是描述为“对特定类型的任意对象的实例方法的引用”的方法引用,它被写成。 任意对象必须是函数接口的抽象方法的第一个参数。 方法引用的签名必须与函数接口的抽象方法的签名相同,没有第一个参数。 因此,具有抽象方法的函数接口只能传递实例方法引用或。例如,我无法传递,其中它是类的实例,其签名为。 是否还有其他案例