Generic kérdés

Fórumok

Üdv!

Van egy érdekes dolog amit nem értek. Van az alábbi kód:


public class BinaryTree< T > {
	private Node< T > root;
	
	public class PreorderIterator< T > implements Iterator< T > {
		Stack< Node< T > > stack = new Stack< Node< T > >();
		
		public PreorderIterator() {
			if(BinaryTree.this.root != null)
				stack.push((Node< T >)BinaryTree.this.root);
		}
        ...

Ebből ezt a sort nem értem:

stack.push((Node< T >)BinaryTree.this.root);

Tegnap kb. 1 órát szívtam mire sikerült működésre bírni, mégpedig azzal hogy a BinaryTree.this.root-ot Node típusúra kasztolom, így lefordul és helyesen(?) működik a program, de nem értem miért. Egy Node típust miért kell ugyanarra a típusra kasztolnom?
Ha átírom így:

stack.push(BinaryTree.this.root)

az alábbi hibaüzenetet kapom:


./binarytree/BinaryTree.java:15: push(binarytree.Node< T >) in java.util.Stack< binarytree.Node< T > > cannot be applied to (binarytree.Node< T >)
                                stack.push(BinaryTree.this.root);                                                                         
                                     ^                                                                                                    
1 error                     

ami számomra teljesen értelmetlen, mert én úgy értelmezem hogy a push(Node< T >) metódust nem tudja alkalmazni egy Node< T > típusú objektumra :O

Ez a Node osztályom:


public class Node< T > {
	Node< T > left,right;
	T data;
	
	public Node(Node< T > other) {
		left = other.left;
		right = other.right;
		data = other.data;
	}
	public Node(Node< T > newLeft, Node< T > newRight, T newData) {
		left = newLeft;
		right = newRight;
		data = newData;
	}
}

Hozzászólások

A belso PreorderIterator T parametere elfedi a kulso BinaryTree T parameteret. A megoldas: a belso T parametert nevezd at masra, es akkor jo lesz.


public class BinaryTree< T > {
	private Node< T > root;

	public class PreorderIterator< U > implements Iterator< U > {
		Stack< Node< U > > stack = new Stack< Node< U > >();
		
		public PreorderIterator() {
			if(BinaryTree.this.root != null)
				stack.push(BinaryTree.this.root);
		}
//...

Így gondoltad? Így most ezt a hibaüzenetet kapom:


./binarytree/BinaryTree.java:20: push(binarytree.Node< U >) in java.util.Stack< binarytree.Node< U > > cannot be applied to (binarytree.Node< T >)
                                stack.push(BinaryTree.this.root);
                                     ^

Ennek az üzenetnek már kicsit több értelmét látom, de hogy tudom kiküszöbölni? :)

Tehát az lenne a célom, hogy van egy bináris fám és azt szeretném bejárni különböző módokon.
Csinálhatnám sima Iterátorral is, de akkor az a next() hívásakor Object-tel tér vissza, én viszon azt szeretném ha olyan típussal térne vissza, mint amilyen típusú elemeket a bináris fában tárolok.


package test;

import java.util.Iterator;
import java.util.Stack;

public class BinaryTree< T > {
	private Node< T > root;
	
	public Iterator< T > getPreorderIterator() {
		return new PreorderIterator();
	}
	
	public class PreorderIterator implements Iterator< T > {
		Stack< Node< T > > stack = new Stack< Node< T > >();
		
		public PreorderIterator() {
			if(BinaryTree.this.root != null)
				
				stack.push(BinaryTree.this.root);
		}

		@Override
		public boolean hasNext() {
			// TODO Auto-generated method stub
			return false;
		}

		@Override
		public T next() {
			return stack.peek().data;
		}

		@Override
		public void remove() {
			// TODO Auto-generated method stub
			
		}
	}
}

Mint lathato, a PreorderIteratorrol levettuk a template parametert, ez igy most jonak tunik.