Why do OpenZeppelin contracts often override both ERC165 & IERC165 for supportsInterface?

Since ERC165 is an abstract contract that implements IERC165, why not just do:

function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165) returns (bool)

Yet, in contracts like ERC721, it's done as follows:

function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool)

since 0.8.12, it is required to override the IERC165