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

在Java 8中,有“方法参考”function。 其中一种是“引用特定类型的任意对象的实例方法”

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

有人可以解释“特定类型的任意对象”在该背景下的含义吗?

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

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

例如,它可以使用两个String对象并在一个上调用compareToIgnoreCase ,并使用另一个作为参数来匹配方法签名。 这允许它根据数组类型的任何方法获取数组并对其进行排序,而不是需要比较器实例来执行此操作。

以下是未点击问题链接的任何人的示例:

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

Oracle Doc链接的示例是:

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

lambda相当于

  String::compareToIgnoreCase 

将会

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

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

不明白?

  • 确保您知道比较器是什么以及如何实现它
  • 了解function界面是什么以及它如何影响Java中的lambdas。
  • 比较器是一个function接口 ,这就是方法引用成为比较器对象内部比较方法体的原因。
  • 阅读下面源代码 ,了解页面底部的另一个示例

阅读更多资料来源: http : //moandjiezana.com/blog/2014/understanding-method-references/

请参阅以下代码示例,其中解释了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中描述的“对特定类型的任意对象的实例方法的引用”类别

如果method参数在同一实例中获取变量Type作为元素的实例Type,则可以使用Type调用该实例方法。(Person :: personInstanceMethod1)

将“Person”类中的“personInstanceMethod1”实例方法与“String”类中的“compareToIgnoreCase”实例方法进行比较( https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareToIgnoreCase -java.lang.String- )查看相似度。 两者都采用相同类型的单个参数。

比较场景1和场景2以查看差异。

在这种情况下,存在特定类型(String)的对象数组,并且数组中的任何随机对象都可以调用其实例方法。 此方法允许类引用其实例方法,就好像它是静态方法一样。

此方法也适用于类似于String的内置类,但不适用于用户定义的类。 在用户定义的类的情况下,实例方法只能由其对象引用。