Commit eb28bdc7 authored by Falko Schumann's avatar Falko Schumann
Browse files

Operation ist nun auch typsicher

parent ed1588d8
Loading
Loading
Loading
Loading
+19 −29
Original line number Diff line number Diff line
@@ -26,10 +26,7 @@

package de.bsvrz.sys.funclib.bitctrl.interpreter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.*;

/**
 * Ein Nicht-Terminal-Symbol des Interpreters, sprich ein Operatorsymbol bzw
@@ -37,7 +34,7 @@ import java.util.List;
 *
 * @author BitCtrl Systems GmbH, Schumann
 */
public class Operation implements Ausdruck {
public class Operation<T, O> implements Ausdruck<T> {

	/**
	 * Der Operator dieser Operation.
@@ -47,7 +44,7 @@ public class Operation implements Ausdruck {
	/**
	 * Die Liste der Operanden.
	 */
	private final List<Ausdruck> operanden;
	private final List<Ausdruck<O>> operanden;

	/**
	 * Konstruiert ein Symbol mit den gegebenen Operator und Operanden.
@@ -60,16 +57,8 @@ public class Operation implements Ausdruck {
	 *             Wenn ein Funktionsparameter {@code null} ist
	 */
	public Operation(final Operator operator,
					 final Ausdruck... operanden) {
		if (operator == null || operanden == null) {
			throw new NullPointerException();
		}

		this.operator = operator;
		this.operanden = new ArrayList<>();
		if (operanden.length > 0) {
			this.operanden.addAll(Arrays.asList(operanden));
		}
					 final Ausdruck<O>... operanden) {
		this(operator, Arrays.asList(operanden));
	}

	/**
@@ -83,8 +72,9 @@ public class Operation implements Ausdruck {
	 *             Wenn ein Funktionsparameter {@code null} ist
	 */
	public Operation(final Operator operator,
					 final List<? extends Ausdruck> operanden) {
		this(operator, operanden.toArray(new Ausdruck[0]));
					 final List<? extends Ausdruck<O>> operanden) {
		this.operator = Objects.requireNonNull(operator, "operator");
		this.operanden = new ArrayList<>(Objects.requireNonNull(operanden, "operanden"));
	}

	/**
@@ -98,7 +88,7 @@ public class Operation implements Ausdruck {
	 *             Wenn ein Funktionsparameter {@code null} ist
	 */
	public Operation(final String operatorSymbol,
					 final Ausdruck... operanden) {
					 final Ausdruck<O>... operanden) {
		this(Operator.getOperator(operatorSymbol), operanden);
	}

@@ -113,13 +103,13 @@ public class Operation implements Ausdruck {
	 *             Wenn ein Funktionsparameter {@code null} ist
	 */
	public Operation(final String operatorSymbol,
					 final List<? extends Ausdruck> operanden) {
		this(operatorSymbol, operanden.toArray(new Ausdruck[0]));
					 final List<? extends Ausdruck<O>> operanden) {
		this(Operator.getOperator(operatorSymbol), operanden);
	}

	@Override
	public List<Ausdruck> getNachfolger() {
		return new ArrayList<>(operanden);
	public List<? extends Ausdruck<O>> getNachfolger() {
		return Collections.unmodifiableList(operanden);
	}

	/**
@@ -127,7 +117,7 @@ public class Operation implements Ausdruck {
	 *
	 * @return Die Liste der Operanden
	 */
	public List<? extends Ausdruck> getOperanden() {
	public List<? extends Ausdruck<O>> getOperanden() {
		return operanden;
	}

@@ -143,11 +133,11 @@ public class Operation implements Ausdruck {
	}

	@Override
	public Object interpret(final Kontext kontext) {
	public T interpret(final Kontext kontext) {
		assert operator != null;

		final List<Object> values = new ArrayList<>();
		for (final Ausdruck a : operanden) {
		final List<O> values = new ArrayList<>();
		for (final Ausdruck<O> a : operanden) {
			if (a != null) {
				values.add(a.interpret(kontext));
			} else {
@@ -155,7 +145,7 @@ public class Operation implements Ausdruck {
			}
		}

		return operator.execute(values);
		return (T) operator.execute(values);
	}

	@Override
@@ -169,7 +159,7 @@ public class Operation implements Ausdruck {
			result += operator + " " + operanden.get(0);
		} else {
			// Es gibt mehr als einen Operanden
			final Iterator<Ausdruck> i = operanden.iterator();
			final Iterator<Ausdruck<O>> i = operanden.iterator();
			Ausdruck a = i.next();

			result += a.toString(); // erster Operand
+2 −2
Original line number Diff line number Diff line
@@ -179,7 +179,7 @@ public final class Operator {
	 *            Menge von Operanden
	 * @return Ergebnis der Operation
	 */
	public Object execute(final List<Object> werte) {
	public Object execute(final List<?> werte) {
		if (handler.size() == 0) {
			throw new InterpreterException(Messages.get(
					InterpreterMessages.HandlerNotFound, getSymbol()));
@@ -216,7 +216,7 @@ public final class Operator {
	 *            Die Operanden
	 * @return Den Text
	 */
	private String getAufrufString(final List<Object> werte) {
	private String getAufrufString(final List<?> werte) {
		final StringBuffer meldung = new StringBuffer("(");
		for (final Object wert : werte) {
			if (meldung.length() > 1) {