gpt4 book ai didi

java - Java 8 和 Bean Info Introspector 中接口(interface)中的默认方法

转载 作者:太空宇宙 更新时间:2023-11-04 13:39:54 25 4
gpt4 key购买 nike

我对 Interface 和 BeanInfo Introspector 中的默认方法有一个小问题。本例中有接口(interface):Interface

public static interface Interface {
default public String getLetter() {
return "A";
}
}

还有两个类ClassA和ClassB:

public static class ClassA implements Interface {
}

public static class ClassB implements Interface {
public String getLetter() {
return "B";
}
}

在主方法中,应用程序从 BeanInfo 打印 PropertyDescriptors:

public static String formatData(PropertyDescriptor[] pds) {
return Arrays.asList(pds).stream()
.map((pd) -> pd.getName()).collect(Collectors.joining(", "));

}

public static void main(String[] args) {


try {
System.out.println(
formatData(Introspector.getBeanInfo(ClassA.class)
.getPropertyDescriptors()));
System.out.println(
formatData(Introspector.getBeanInfo(ClassB.class)
.getPropertyDescriptors()));
} catch (IntrospectionException e) {
e.printStackTrace();
}

}

结果是:

class
class, letter

为什么默认方法“letter”在 ClassA 中不可见作为属性?这是错误还是功能?

最佳答案

我猜想,Introspector 不会处理接口(interface) 层次结构链,尽管使用 Java 8 虚拟扩展方法(又名防御者、默认方法)接口(interface)可以有一些看起来像属性方法的东西。这是一个相当简单的内省(introspection)器,声称它确实如此:BeanIntrospector

这是否可以被视为一个错误有点灰色地带,这就是我这么认为的原因。

显然,现在类可以从接口(interface)“继承”一个方法,该方法具有官方认为的 getter/setter/mutator 的所有品质。但与此同时,这整件事违背了接口(interface)的目的——接口(interface)不可能提供任何可以被视为属性的东西,因为它是无状态和无行为的,它只是为了描述行为。即使防御者方法基本上也是静态的,除非它们访问具体实现的真实属性。

另一方面,如果我们假设防御者是正式继承的(与提供默认实现相反,这是一个相当模糊的定义),它们应该会导致在实现类中创建合成方法,并且这些方法属于该类并作为PropertyDescriptor查找的一部分进行遍历。 显然事实并非如此,否则整个事情都会正常进行。 :) 看来防御者方法在这里得到了某种特殊对待。

关于java - Java 8 和 Bean Info Introspector 中接口(interface)中的默认方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31334557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com