class Match {

    public boolean matches(T other) {
        if (matchAny) {
            return true;
        } else if (other == null) {
            return negation ? value != null : value == null;
        } else {
            if (value instanceof byte[]) {
                boolean equal = Arrays.equals((byte[]) value, (byte[]) other);
                return negation ? !equal : equal;
            }
            return negation ? !Objects.equals(value, other) : Objects.equals(value, other);
        }
    }

    private  Match();
    private  Match(T value, boolean negation);

}