class 可以有两个同名的无参数方法吗?
Can a class have two no-args methods with same name?
阅读文档:
https://docs.oracle.com/javase/9/docs/api/java/util/ServiceLoader.html
我被这句话搞糊涂了:
The service provider class file has more than one public static
no-args method named "provider
".
假设 JavaDoc 是正确的,并且假设 static
成员不是继承的,这在 Java 中怎么可能?还是 JavaDoc 中的错误?
how this might be possible in Java?
不是,因为方法签名必须是唯一的,签名是方法名和参数类型。
除了, JVM 不是这样工作的,只有 Java 是这样工作的。
JVM 包括 return 类型作为签名的一部分,因此从技术上讲,一个 class 可以有多个名称和参数相同但 return 类型不同的方法。
所以它肯定会发生在用其他 JVM 语言编写的 classes 上,但是它会发生在 Java class 上吗?
是的,当您为重写方法设置协变 return 类型时,它可以。参见 Can overridden methods differ in return type?
鉴于 that answer 中的示例,真正发生的是这个假代码:
class ShapeBuilder {
...
public Shape build() {
....
}
class CircleBuilder extends ShapeBuilder{
...
@Override
public bridge Shape build() { // override matches full JVM signature
return <Circle>build(); // call other method with different return type
}
public Circle build() {
....
}
"bridge"方法是编译器为了区别Java和JVM正常工作而生成的隐藏方法。
仅供参考: 在这方面,"bridge" 方法类似于 "synthetic" 方法,它们由编译器生成以允许外部 classes 访问内部 classes 的 private
成员,反之亦然。
阅读文档:
https://docs.oracle.com/javase/9/docs/api/java/util/ServiceLoader.html
我被这句话搞糊涂了:
The service provider class file has more than one
public static
no-args method named "provider
".
假设 JavaDoc 是正确的,并且假设 static
成员不是继承的,这在 Java 中怎么可能?还是 JavaDoc 中的错误?
how this might be possible in Java?
不是,因为方法签名必须是唯一的,签名是方法名和参数类型。
除了, JVM 不是这样工作的,只有 Java 是这样工作的。
JVM 包括 return 类型作为签名的一部分,因此从技术上讲,一个 class 可以有多个名称和参数相同但 return 类型不同的方法。
所以它肯定会发生在用其他 JVM 语言编写的 classes 上,但是它会发生在 Java class 上吗?
是的,当您为重写方法设置协变 return 类型时,它可以。参见 Can overridden methods differ in return type?
鉴于 that answer 中的示例,真正发生的是这个假代码:
class ShapeBuilder {
...
public Shape build() {
....
}
class CircleBuilder extends ShapeBuilder{
...
@Override
public bridge Shape build() { // override matches full JVM signature
return <Circle>build(); // call other method with different return type
}
public Circle build() {
....
}
"bridge"方法是编译器为了区别Java和JVM正常工作而生成的隐藏方法。
仅供参考: 在这方面,"bridge" 方法类似于 "synthetic" 方法,它们由编译器生成以允许外部 classes 访问内部 classes 的 private
成员,反之亦然。