对特定对象的实例方法的引用会破坏 Java 中的类型安全吗?

Ale*_* Mi 5 type-safety java-8 method-reference

对特定对象的实例方法的引用的概念是否破坏了 Java 中的类型安全?

根据

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

你可以有一个不实现 Comparator 接口的自定义类比较提供者,并且仍然使用这个类的实例作为方法的第二个参数

Arrays.sort(T[] a, 比较器 c)

当然,ComparisonProvider 的实现必须有一个方法,其签名与 Comparator.compare() 方法完全匹配,但这仍然不是 Comparator 的实例,不是吗?

本质上,Java 8 允许我们使用类的实例,就好像它们正在实现特定的接口一样,而实际上它们不是。

这意味着,我们正在失去 Java 中的类型安全性,对吗?

Era*_*ran 1

Java 8 允许我们使用类的实例,就好像它们正在实现特定的接口一样,但实际上它们并非如此

不完全是,它允许您使用某个类实例的单个方法,就好像它正在实现某个功能接口一样。

而且它没有添加 Java 7 中不存在的任何功能 - 它只是为您提供了编写该功能的捷径。

例如,代替:

Arrays.sort(someArray, someInstance::someMethod);
Run Code Online (Sandbox Code Playgroud)

在 Java 7 中你可以使用匿名类实例来编写:

Arrays.sort(someArray, new Comparator<SomeType> () {
                public int compare (SomeType one, SomeTypeTwo) {
                    return someInstance.someMethod(one,two);
                }
            });
Run Code Online (Sandbox Code Playgroud)

只要实例方法是可访问的(即公共的),您就可以根据需要使用它。

  • @pvg 也许我的措辞很糟糕。我的意思是,使用任意实例方法作为其类未实现的某些接口的实现,在 Java 7 中仍然可以在没有方法引用的情况下完成。 (2认同)