Java 8 在java方法引用中ContainingType是什么意思

Java 8 在java方法引用中ContainingType是什么意思,java-8,Java 8,在Java方法引用中 ContainingClass::staticMethodName-表示类可以引用静态方法(引用静态方法) containingObject::instanceMethodName-表示首先创建类对象,然后使用该对象引用instanceMethod 我的怀疑是 ContainingType::methodName-ContainingType是什么意思 ContainingType是一个类似于字符串或其他东西的java预定义类吗?我认为您的ContainingType::m

在Java方法引用中

ContainingClass::staticMethodName-表示类可以引用静态方法(引用静态方法)

containingObject::instanceMethodName-表示首先创建类对象,然后使用该对象引用instanceMethod

我的怀疑是

ContainingType::methodName-ContainingType是什么意思


ContainingType是一个类似于字符串或其他东西的java预定义类吗?

我认为您的
ContainingType::methodName
是上述两种形式的通用/通用形式…

java语言规范:

有四种引用类型:类类型()、接口类型()、类型变量()和数组类型()

数组类型没有静态方法,因此这不适用于静态方法引用,但您可以执行其他3个操作:

class MyClass {
    static void doIt() {/*doing it*/}
}
interface MyInterface {
    static void doIt() {/*doing it*/}
}
class Test<T extends MyClass> {
    void test() {
        Runnable m1 = MyClass::doIt;     // class type
        Runnable m2 = MyInterface::doIt; // interface type
        Runnable m3 = T::doIt;           // type variable
    }
}

在您提供的文档中,有一个ContainingType示例:

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

方法引用String::compareToIgnoreCase的等效lambda表达式将具有形式参数列表(字符串a、字符串b),其中a和b是用于更好地描述此示例的任意名称。方法引用将调用方法a.compareToIgnoreCase(b)


我认为,stringArray的元素没有名称(例如:String s1=“Barbara”),因此不能通过包含Object::instanceMethodName(例如:s1::CompareTignoreCase)来引用它。这就是为什么它使用ContainingType。

这些在
Java
之前的
Java8
中是非法的。。。所以你应该更改标签。你能给出一个链接,说明你是从哪里得到这个标签的吗?@Sweeper你的代码不是一个有效的例子。我做了一些改变。类MyClass{void doIt(String str){System.out.println(str.toUpperCase();};};};}和内部测试方法I包括这两行:Consumer m1=MyClass::doIt;m1.接受(“Raj”);Runnable m1=MyClass::doIt;此声明在本例中(已涵盖)包含Class::staticMethodName。我不知道为什么会引入ContainingType::methodName?@RajGopalBhallamudi答案的前半部分是在您发布链接到使用“ContainingType”的位置之前写的,因此答案的这一部分是泛型的,这就是为什么它显示了静态方法调用的示例。答案的后半部分更直接地回答了在您提供的链接中使用“containing type”的问题,并且使用任意对象的实例方法调用更新了示例。--您是对的,这个示例不是“工作”示例,只是简单地展示了创建方法引用的各种方法的语法。它们不能“工作”,但可以编译。@RajGopalBhallamudi 1)预定义类和用户定义类之间没有任何区别2) 似乎您没有阅读或不理解
ContainingClass::staticMethodName
ContainingType::methodName
之间的区别。第二个是实例(即非静态)方法。该示例使用方法
compare(to1,to2)
为功能接口
Comparator
定义了方法引用。
String.compareTignoreCase(String str)
可以实现该方法,其中
o1
变成
this
,而
o2
变成
str
@RajGopalBhallamudi尝试阅读我写的内容<代码>字符串::compareToIgnoreCase未引用静态方法
String
是一个类,因此也是一个类型,因此它是实例方法
compareTignoreCase
的包含类型。我回答的第二部分显示了用户定义类(
Consumer m1=MyClass::doIt
)的示例,证明它可以用于所有类,而不仅仅是内置类。
String[] stringArray = { "Barbara", "James", "Mary", "John",
          "Patricia", "Robert", "Michael", "Linda" };
Arrays.sort(stringArray, String::compareToIgnoreCase);