REF: use extract_array in DataFrame.combine_first
- [ ] closes #xxxx
- [ ] tests added / passed
- [x] passes `black pandas`
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [ ] whatsnew entry

lgtm cc @jbrockmendel  the extract_array part looks good, but not clear why the needs_i8_conversion part can be removed safely > the extract_array part looks good, but not clear why the needs_i8_conversion part can be removed safely

I reverted it

Although CI is not passing without for lack of testing with datelike input - AFAICT we have good (but maybe not water-tight) coverage there > Although CI is not passing without for lack of testing with datelike input - AFAICT we have good (but maybe not water-tight) coverage there

it may be unnecessary (in fact i hope it is), just want to have an idea why its unnecessary (or at least make sure we have relevant test coverage) > > Although CI is not passing without for lack of testing with datelike input - AFAICT we have good (but maybe not water-tight) coverage there
> 
> it may be unnecessary (in fact i hope it is), just want to have an idea why its unnecessary (or at least make sure we have relevant test coverage)

Ok! Checked that both parts of the if/else clause inside `if needs_i8_conversion(arr.dtype)` are hit in:
```
pandas/tests/frame/methods/test_combine_first.py::TestDataFrameCombineFirst::test_combine_first_timezone
pandas/tests/frame/methods/test_combine_first.py::TestDataFrameCombineFirst::test_combine_first_period
``` thanks @arw2019 