Commit eb28bdc7 authored by Falko Schumann's avatar Falko Schumann

Operation ist nun auch typsicher

parent ed1588d8
......@@ -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
......
......@@ -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) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment