ContainingType在java方法引用中的含义是什么

时间:2017-08-30 06:52:18

标签: java-8

在Java方法参考中

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

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

我怀疑是

ContainingType :: methodName - ContainingType是什么意思?

ContainingType是java中的预定义类,如String还是其他什么?

3 个答案:

答案 0 :(得分:4)

Java语言规范,§4.3. Reference Types and Values

  

有四种引用类型:类类型(§8.1),接口类型(§9.1),类型变量(§4.4)和数组类型(§10.1)。

数组类型没有静态方法,因此不适用于静态方法引用,但可以执行其他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
    }
}

现在link中提供了comment,它说:

  1. 参考静态方法
    ContainingClass::staticMethodName

  2. 引用特定对象的实例方法
    containingObject::instanceMethodName

  3. 引用特定类型的任意对象的实例方法
    ContainingType::methodName

  4. 对构造函数的引用
    ClassName::new

  5. 此处,ContainingType再次引用上面提到的3种引用类型中的任何一种:类,接口和类型变量。

    然后,您可以为此类型的任何实例方法创建方法引用。

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

答案 1 :(得分:1)

https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

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

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

并解释:

<块引用>

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

我认为,stringArray 的元素没有名称(例如:String s1 = "Barbara"),因此您不能通过 containsObject::instanceMethodName(例如:s1::compareToIgnoreCase)来引用它。这就是它使用 ContainingType 的原因。

答案 2 :(得分:0)

我认为您的ContainingType::methodName是以上两种形式的一般/常见形式......