Ü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;
}
}
- 1247 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
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? :)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Köszi, így valóban működik!
Valamiért azt hittem hogy ha generic osztályból származtatok akkor annak is genericnek kell lennie.
Be kéne szereznem egy könyvet :D
- A hozzászóláshoz be kell jelentkezni
Nem latom, hol szarmaztatsz generic osztalybol. Te csak egy bizonyos tipusu interface-t implementalsz.
- A hozzászóláshoz be kell jelentkezni
Szerintem -- ha még nem ismered -- ez esetleg segíthet a generic-et jobban megértened:
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
G.
============================================
"Share what you know. Learn what you don't."
- A hozzászóláshoz be kell jelentkezni