class JobParameter<T> implements Serializable {

	private final T value;

	private final Class<T> type;

	private final boolean identifying;

	/**
	 * Create a new {@link JobParameter}.
	 * @param value the value of the parameter. Must not be {@code null}.
	 * @param type the type of the parameter. Must not be {@code null}.
	 * @param identifying true if the parameter is identifying. false otherwise.
	 */
	public JobParameter(@NonNull T value, @NonNull Class<T> type, boolean identifying) {
		Assert.notNull(value, "value must not be null");
		Assert.notNull(type, "type must not be null");
		this.value = value;
		this.type = type;
		this.identifying = identifying;
	}

	/**
	 * Create a new identifying {@link JobParameter}.
	 * @param value the value of the parameter. Must not be {@code null}.
	 * @param type the type of the parameter. Must not be {@code null}.
	 */
	public JobParameter(@NonNull T value, @NonNull Class<T> type) {
		this(value, type, true);
	}

	/**
	 * @return The identifying flag. It is set to {@code true} if the job parameter is
	 * identifying.
	 */
	public boolean isIdentifying() {
		return identifying;
	}

	/**
	 * @return the value contained within this {@code JobParameter}.
	 */
	public T getValue() {
		return value;
	}

	/**
	 * Return the type of the parameter.
	 * @return the type of the parameter
	 */
	public Class<T> getType() {
		return type;
	}

	@Override
	public boolean equals(Object obj) {<FILL_FUNCTION_BODY>}

	@Override
	public String toString() {
		return "{" + "value=" + value + ", type=" + type + ", identifying=" + identifying + '}';
	}

	@Override
	public int hashCode() {
		return 7 + 21 * value.hashCode();
	}

}

		if (!(obj instanceof JobParameter rhs)) {
			return false;
		}

		if (this == obj) {
			return true;
		}

		return type == rhs.type && value.equals(rhs.value);
	
<no_super_class>