2

当以下类被分成不同的包时,它是空指针:java.lang.NullPointerException: Cannot invoke method addPropertyChangeListener() on null object.但是,将它们组合到一个包中是可行的。

包装parents

package parents

import groovy.beans.Bindable
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

@Bindable
class GrandParent<T extends Parent> implements PropertyChangeListener {
  String pets
  GrandParent() {
    this.addPropertyChangeListener(this)
  }
  @Override
  void propertyChange(PropertyChangeEvent evt) {
    println "prop change -> $evt"
  }
}

class Parent extends GrandParent {}

包裹children

package children

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import groovy.beans.Bindable
import parents.*

class Child extends Parent {
  @Bindable 
  String brothers
  static main(args) {
    Child child = new Child()
    child.pets = "Leo, Sophie"
    child.brothers = "Douglas, Ted"
  }
}

将它们全部放在一个包/文件中(注释掉import parents.*),您会发现它有效,打印:

> prop change -> java.beans.PropertyChangeEvent[propertyName=pets; oldValue=null; newValue=Leo, Sophie; propagationId=null; source=children.Child@7eceb95b]
> prop change -> java.beans.PropertyChangeEvent[propertyName=brothers; oldValue=null; newValue=Douglas, Ted; propagationId=null; source=children.Child@7eceb95b]

这是为什么?

4

1 回答 1

0

将泛型添加<Parent>到 Parent 类声明让事情再次运行:

public class Parent extends GrandParent <Parent> { ... }
于 2014-10-03T13:32:40.843 回答