当前位置: 首页 > 面试题库 >

为什么LongProperty实现Property 但不是财产?

陶飞鸿
2023-03-14
问题内容

我遇到了JavaFX
API中似乎很奇怪的东西:LongProperty实现Property<Number>,但不是Property<Long>

这是什么原因呢?我有点想法,这全都源于Java固有的协变和逆变问题,因为泛型是通过擦除 愚蠢地
实现的,以保持与字节码的向后兼容性。但是同时LongProperty实现Property<Number>
会出现什么问题Property<Long>呢?


问题答案:

不能同时 实现。

为此,它需要在使用泛型的接口中实现每种方法的两个版本。让我们举一个例子:

bindBidirectional(Property<Long> other) { ... }

在幕后,擦除意味着可以简化为:

bindBidirectional(Property other) { ... }

那么,什么将实现Property<Number>Property<Long>做什么呢?它有两种方法

bindBidirectional(Property<Long> other) { ... }
bindBidirectional(Property<Number> other) { ... }

…在擦除后将编译为两种方法:

bindBidirectional(Property other) { ... }
bindBidirectional(Property other) { ... }

这两种方法相互冲突,并且无法在运行时解决它们。

即使您使用了一些编译器技巧来解决此问题,当有人将LongProperty用作原始Property时会发生什么?

Property rawLongProperty = new LongProperty();
rawLongProperty.bindBidirectional(someOtherRawProperty);

无法知道bindDirectional要解决的两个变体中的哪个。



 类似资料:
  • 静态编程语言中的属性和开放属性有什么区别?下面的代码抱怨我声明setter私有,Intellij说开放属性不允许私有setter。什么是开放属性? 为什么上面的代码无效,而这个代码有效? 编辑:我使用的是spring-allopen插件,将类显式标记为open并没有什么不同。

  • 问题内容: 你知道吗 : 将输出: 这是由于(继承自)未覆盖的事实引起的。 您知道为什么会这样吗? 问题答案: 根据的合同,没有针对s 的通用equals()方法,因此无法提供一个。 请注意,它既不是Set也不是List,因此既不是数量也不是它不支持的原因。

  • 问题内容: 有谁知道为什么 不执行?这意味着您无法对排序,这在我看来有点奇怪。 讨论后更新: 感谢所有有用的回复。最后,我对该主题进行了更多研究。 为什么java.lang.Number不实现Comparable的最简单解释源于可变性问题。 对于位的检讨,是抽象的超类型的,,,,,,,,和。在该列表中,并以没有实现。 深入研究,我发现在可变类型上实现不是一种好习惯,因为在比较期间或之后对象可能会更

  • 问题内容: 的类是代表一地图,其中键和值都是字符串。这是因为对象用于读取文件,即文本文件。 那么,为什么他们在Java 5中不对此类进行改造以实现呢? 该javadoc的状态: 因为Properties是从Hashtable继承的,所以put和putAll方法可以应用于Properties对象。强烈建议不要使用它们,因为它们允许调用方插入键或值不是字符串的条目。应该改用setProperty方法。

  • 本文向大家介绍"attribute"和"property"有什么不同?相关面试题,主要包含被问及"attribute"和"property"有什么不同?时的应答技巧和注意事项,需要的朋友参考一下 property 是DOM中的属性,是JavaScript里的对象 可以读取标签自带属性,包括没有写出来的 不能读取attribute设置的属性 获取方式:读:element.property;     

  • 所以我这里有一个程序,它只是简单地模仿跳棋(但不是跳,而是一个棋子简单地“吃掉”另一个棋子)。我有一个简单的类,它实现了一个“checkers”类对象,并创建了一个名为“chips”的int数组变量。还有一个“while”语句,它在chip[0]和chips[1]整数大于0时创建了一个循环。看起来是这样的: Checkers类中的count方法如下所示: 板是8 x 8(这就是board.leng