Jak utworzyć stos dowolnych obiektów na tablicy - Generics Array.

0
package Stack;

import java.util.EmptyStackException;

public class Stack<ObjectType> {
	private ObjectType[] stackArray; // Array elements put on the stack
	private int stackSize; // amount of elements on the stack
	private int topOfStack; // monitoring the element on the top of the stack

	public Stack<ObjectType>(int stackSize) {
		this.stackSize = stackSize;
		this.stackArray = new Stack<ObjectType>[stackSize];
	}

	public void push(ObjectType input) throws ArrayIndexOutOfBoundsException {
		if (topOfStack < stackSize) {
			stackArray[topOfStack++] = input;
		} else
			throw new ArrayIndexOutOfBoundsException();
	}

	public ObjectType pop() {
		if (topOfStack == 0)
			throw new EmptyStackException();
		ObjectType popped = stackArray[--topOfStack];
		stackArray[topOfStack] = null;
		return popped;
	}

	public ObjectType peek() {
		if (topOfStack > 0)
			return stackArray[topOfStack - 1];
		else
			return null;
	}

	public static void main(String[] args) {

		String text = "Lorem ipsum dolor sit amet, dolore reformidans vel no, quo inermis deseruisse persequeris an. Qui ad veritus docendi. Suas feugiat commune sed te, odio docendi luptatum duo no.";
		String[] txt = text.split("\\s|\\,\\s|\\.\\s|\\.");
		Stack stack = new Stack(txt.length);
		try {
			for (int i = 0; i < txt.length; i++)
				stack.push(txt[i]);
			// stack.push("One more plox");
		} catch (ArrayIndexOutOfBoundsException stackFull) {
			System.out
					.println("With all the respect, Sir, but stack is already full.");
		}
		stack.pop();
		System.out.println(stack.peek());
		

	}
}

Problem jest taki, że chciałbym stworzyć uniwersalny stos dla dowolnego obiektu, ale niestety jak widać nie jest to takie proste jak myślałem. Znalazłem takie coś na stackoverflow http://stackoverflow.com/questions/529085/how-to-create-a-generic-array-in-java, ale nie mam pojęcia jaka jest różnica pomiędzy podanymi rozwiązaniami, a tym bardziej nie wiem które jest bardziej poprawne, a nie chcę korzystać z czegoś czego nie rozumiem.. I czy wgl się z czegoś takiego korzysta? Czy jest sens to obchodzić na siłe, czy może jakoś inaczej warto to zrobić??

Oczywiście jeżeli macie dodatkowo jakieś uwagi na temat mojego kodu, coś jest brzydko, niepoprawnie, albo tak się nie robi to dajcie znać.

0

Nie możesz zrobić new T gdyż T jest wymazywane na etapie kompilacji (type erasure) i staje się zwykłym Object (lub czymś innym, ale zawsze czymś stałym).

Możesz użyć rozwiązań podanych w wątku na StackOverflow lub, jeżeli korzystasz z Javy 8, posłużyć się "lambdami": http://www.speakingcs.com/2014/08/constructor-references-in-java-8.html

0

A czy któreś z tamtych rozwiązań jest lepsze od drugiego? Bo nie bardzo wiem o co chodzi z tym strong typing i weak typing, a wiem, że w programowaniu nie wystarczy, że po prostu działa i dobrze by było jakby coś było poprawnie zapisane/użyte

1

<abbr title="moim skromnym zdaniem">MSZ</abbr> ranking przedstawia się następująco:

  • constructor reference w Javie 8,
  • checked,
  • unchecked,
0

Super, dzięki :) A jeszcze jakbyś mógł mi powiedzieć cóż to za ranking?

1

Ranking lepszości, który przecież chciałeś. Wszystkie rozwiązania zadziałają poprawnie jeśli się je odpowiednio użyje, ale MSZ te wyżej w rankingu więcej rzeczy wymuszają, a więc jednocześnie trudniej zapomnieć o jakimś potrzebnym rzutowaniu.

0

Miałem na myśli co to MSZ, bo pierwszo słyszę o takim skrócie (no, chyba że chodzi o Ministerstwo Spraw Zagranicznych ;))

0

Jest podkreślone. Najedź myszką :P Polski odpowiednik IMHO.

0
	public Stack(Class<ObjectType> objectType, int stackSize) {
		this.stackSize = stackSize;
		@SuppressWarnings("unchecked")
		final ObjectType[] stackArray = (ObjectType[]) Array.newInstance(
				objectType, stackSize);
		this.stackArray = stackArray;
	}

Dobra, wiem że naczelna zasada programistów mówi, że jak działa to nie należy ruszać, ale ja bym chciał to zrozumieć więc jak znajdziesz chwilkę to prosiłbym o wytłumaczenie co to jest @SuppressWarnings, dlaczego final, o co chodzi z tym, że Class<ObjectType>, bo wiem że jak tworze obiekt musze napisać XXXX.class, i dlaczego jest tu rzutowanie i co robi Array.newInstance. Czyli w zasadzie wszystko..

1 użytkowników online, w tym zalogowanych: 0, gości: 1