@Override
	public boolean isSubFilterOf(Filter<VTMatch> otherFilter) {

		Class<?> clazz = getClass();
		Class<?> otherClazz = otherFilter.getClass();
		if (!clazz.equals(otherClazz)) {
			return false; // must be the same class
		}

		TagFilter otherTagFilter = (TagFilter) otherFilter;
		Set<String> names = excludedTags.keySet();
		Set<String> otherNames = otherTagFilter.excludedTags.keySet();

		//
		// This filter is a collection of 'things', that are NOT allowed to pass the filter.
		// We are only a sub-filter if the other filter is a subset of our filter, since we will
		// be taking the already excluded items and adding more restrictions.  Suppose our filter
		// consists of: 'cat', 'dog', 'mouse'.  We would then be a sub-filter if the other
		// filter's set consists of: 'cat', 'dog'.
		//
		if (names.containsAll(otherNames)) {
			return true;
		}

		return false;
	}
This differs from {@link #initializeTags()} in that this method will keep any excluded
tags when updating.
Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/filters/TagFilter.java