public NType merge(NType a,NType b) throws MergeFailed {
  if (a != null && b == null)   return a;
  if (a == null && b != null)   return b;
  if (a == null && b == null)   return null;
  if (a.equals(b))   return a;
  try {
    return Dispatcher.dispatch(getClass(),this,"accept",a,b);
  }
 catch (  NoSuchMethodException e) {
    throw new MergeFailed("a and b are of different NType",a,b);
  }
}

public NType merge ( NType a , NType b ) throws MergeFailed { if ( a != null && b == null ) return a ; if ( a == null && b != null ) return b ; if ( a == null && b == null ) return null ; if ( a . equals ( b ) ) return a ; try { return Dispatcher . dispatch ( getClass ( ) , this , "accept" , a , b ) ; } catch ( NoSuchMethodException e ) { throw new MergeFailed ( "a and b are of different NType" , a , b ) ; } }
merge a and b .
