Type safety

  • Themenstarter Themenstarter schmek
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

schmek

Gast
Hallo

Bekomme eine Warnung und hab keine Ahnung was ich ändern müsste:

Programmzeile:
structure.addExpression(structure.getStructureFactory().createMult(structure.get(left),structure.get(right)));

Warnung:
Type safety: The method createMult(Expression, Expression) belongs to the raw type AbstractStructureFactory. References to generic type AbstractStructureFactory<T> should be parameterized.

Danke für die Hilfe.
Willi
 
Das bedeutet, daß AbstractStructureFactory verschiedene Typen verwalten kann
und du den Java-Compiler 1.5 benutzt.

Es geht darum, daß du seit Java 1.5, beispielsweise Collection-Klassen typkonform
benutzen kannst.

< Java 1.5 : Vector myVec = new Vector() speichert alle möglichen Objekte
>= Java 1.5 : Vector<String> myVec = new Vector<String> wacht darüber nur Strings zu speichern.

Wenn du zu verwendenden Typ kennst (symbolisch T genannt), gib ihn bei der Deklaration an,
ansonsten nutze Object um den Compiler zu beruhigen.

Code:
AbstractStructureFactory<MeinTyp> wasAuchImmerIchBin = new AbstractStructureFactory<MeinTyp>;
Code:
AbstractStructureFactory<Object> wasAuchImmerIchBin = new AbstractStructureFactory<Object>;
 
Also das ist das komplette Programm. Da die AbstractStructureFactory abstract ist, werden nicht direkt Typen angelegt, sondern abgeleitete Typen angelegt:



Code:
package algebraicStructuresFactory;

import algebraicStructures.Expression;
import inout.In;
import inout.Out;

public class AlgebraicStructureTest {

	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		AbstractStructureFactory structureFactory;
		int decide,index,left,right;
		String constant;
		Out.print("Decide on ring system:" +
				"\n[1] for Bool" +
				"\n[2] for Modulo 5" +
				"\nYour selection: ");
		decide = In.readInt();
		switch(decide){
		case 1: 
			structureFactory = new BoolStructureFactory();
			break;
		case 2:
			structureFactory = new Z5StructureFactory();
			break;
		default:
			Out.println("invalid input");
			return;
		}
		AlgebraicStructure structure = new AlgebraicStructure(structureFactory);
		
		do{
			Out.print("\nCommands are:" +
					"\n[1] - for new constant" +
					"\n[2] - for evaluate" +
					"\n[3] - for multiplication expression" +
					"\n[4] - for plus expression" +
					"\n[5] - for quit" +
					"\nSelect your command:");
			decide = In.readInt();
			if(decide == 1){
				Out.print("  Constant: ");
				constant = In.readWord();
				#structure.addExpression(structure.getStructureFactory().createConst(constant));

			}
			if(decide == 2){
				Out.print("  Index: ");
				index = In.readInt();
				#structure.addExpression(structure.get(index).evaluate());
			}
			if(decide == 3){
				Out.print("Index left operand: ");
				left = In.readInt();
				Out.print("Index right operand: ");
				right = In.readInt();
				#structure.addExpression(structure.getStructureFactory().createMult(structure.get(left),structure.get(right)));
			}
			if(decide == 4){
				Out.print("Index left operand: ");
				left = In.readInt();
				Out.print("Index right operand: ");
				right = In.readInt();
				#structure.addExpression(structure.getStructureFactory().createPlus(structure.get(left),structure.get(right)));
			}
			if (decide != 5){
				#Out.println("[" + (structure.size()-1) + "] " + structure.get(structure.size()-1));
			}
		}while(decide != 5);
	}
}

[\code]

Hab leider keine Ahnung was ich bei den Objekten anders schreiben müsste um keine Fehlermeldungen (Zeile mit Asterix #) zu bekommen.[code]
Code:
 
Also das ist das komplette Programm. Da die AbstractStructureFactory abstract ist, werden nicht direkt Typen angelegt, sondern abgeleitete Typen angelegt:

Code:
package algebraicStructuresFactory;

import algebraicStructures.Expression;
import inout.In;
import inout.Out;

public class AlgebraicStructureTest {

	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		AbstractStructureFactory structureFactory;
		int decide,index,left,right;
		String constant;
		Out.print("Decide on ring system:" +
				"\n[1] for Bool" +
				"\n[2] for Modulo 5" +
				"\nYour selection: ");
		decide = In.readInt();
		switch(decide){
		case 1: 
			structureFactory = new BoolStructureFactory();
			break;
		case 2:
			structureFactory = new Z5StructureFactory();
			break;
		default:
			Out.println("invalid input");
			return;
		}
		AlgebraicStructure structure = new AlgebraicStructure(structureFactory);
		
		do{
			Out.print("\nCommands are:" +
					"\n[1] - for new constant" +
					"\n[2] - for evaluate" +
					"\n[3] - for multiplication expression" +
					"\n[4] - for plus expression" +
					"\n[5] - for quit" +
					"\nSelect your command:");
			decide = In.readInt();
			if(decide == 1){
				Out.print("  Constant: ");
				constant = In.readWord();
				structure.addExpression(structure.getStructureFactory().createConst(constant));

			}
			if(decide == 2){
				Out.print("  Index: ");
				index = In.readInt();
				structure.addExpression(structure.get(index).evaluate());
			}
			if(decide == 3){
				Out.print("Index left operand: ");
				left = In.readInt();
				Out.print("Index right operand: ");
				right = In.readInt();
				structure.addExpression(structure.getStructureFactory().createMult(structure.get(left),structure.get(right)));
			}
			if(decide == 4){
				Out.print("Index left operand: ");
				left = In.readInt();
				Out.print("Index right operand: ");
				right = In.readInt();
				structure.addExpression(structure.getStructureFactory().createPlus(structure.get(left),structure.get(right)));
			}
			if (decide != 5){
				Out.println("[" + (structure.size()-1) + "] " + structure.get(structure.size()-1));
			}
		}while(decide != 5);
	}
}
 
Da ich keinen Schimmer habe, was AlgebraicStructureTest sein soll, ein
einfacher Vorschlag: Ignorier die Fehlermeldung (vorerst) noch.

Oder versuch mal mit "javac -source 1.4 Blubber.java"
 
Hallo...falls dich beruhigt...mit genau demselben Problem hab ich auch zu kämpfen (mach dieselber Aufgabe)...bei mir sind aber leider noch mehr Warnungen vorhanden wegen der Typsicherheit...wie hast du das mit der Expressionliste gelöst? Die muss man doch auch einbauen und kann aber leider den Platzhaltertyp bei Expression nicht genau bestimmen zu Beginn...also kommts auch zu TypeSafetys....

mfg.
Hannes
 
Lest euch dieses Dokument durch, das sollte die meisten Fragen bezüglich Generics beantworten :wink:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben