在Java方法参考中
ContainingClass :: staticMethodName - 表示类可以引用静态方法(引用静态方法)
containingObject :: instanceMethodName - 表示首先创建一个类对象,然后该对象用于引用instanceMethod。
我怀疑是
ContainingType :: methodName - ContainingType是什么意思?
ContainingType是java中的预定义类,如String还是其他什么?
答案 0 :(得分:4)
Java语言规范,§4.3. Reference Types and Values:
数组类型没有静态方法,因此不适用于静态方法引用,但可以执行其他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
}
}
参考静态方法
ContainingClass::staticMethodName
引用特定对象的实例方法
containingObject::instanceMethodName
引用特定类型的任意对象的实例方法
的 ContainingType::methodName
强>
对构造函数的引用
ClassName::new
此处,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
是以上两种形式的一般/常见形式......