"Lars Dam" <lars_simple_spam_protection_dam@post2.tele.dk> skrev i en
meddelelse news:q9idftovqrf89unq5gf314nppn1htasi29@4ax.com...
[.....]
>
> Det kan du ikke. Java har desværre ikke templates/generic/whatever
> types, så du kan lave sådan noget snask. Du kan så:
>
> 1) bruge en fælles superklasse, og checke retur typen _efter_kaldet
> til inspect, evt. vha. instanceof.
Du kan også bruge en udvidet compiler som fx GJ, der understøtter dette (se
http://www.cs.bell-labs.com/who/wadler/pizza/gj/)- den håndterer fx
templates.
Det er så småt på vej ind i Java - se evt JSR014
(
http://developer.java.sun.com/developer/earlyAccess/adding_generics/).
GJ genererer standard bytecode, der kan linkes med al anden bytecode - den
sparer bare lidt tastearbejde.
Her er et eksempel på en generisk collection, iterator og linked list i GJ
interface Collection<A> {
public void add(A x);
public Iterator<A> iterator();
}
interface Iterator<A> {
public A next();
public boolean hasNext();
}
class NoSuchElementException extends RuntimeException {}
class LinkedList<A> implements Collection<A> {
protected class Node {
A elt;
Node next = null;
Node (A elt) { this.elt=elt; }
}
protected Node head = null, tail = null;
public LinkedList () {}
public void add (A elt) {
if (head==null) { head=new Node(elt); tail=head; }
else { tail.next=new Node(elt); tail=tail.next; }
}
public Iterator<A> iterator () {
return new Iterator<A> () {
protected Node ptr=head;
public boolean hasNext () { return ptr!=null; }
public A next () {
if (ptr!=null) {
A elt=ptr.elt; ptr=ptr.next; return elt;
} else
throw new NoSuchElementException ();
}
};
}
}
}
Den tillader dig så et skrive kode som fx
class Test {
public static void main (String[] args) {
// byte list
LinkedList<Byte> xs = new LinkedList<Byte>();
xs.add(new Byte(0)); xs.add(new Byte(1));
Byte x = xs.iterator().next();
// string list
LinkedList<String> ys = new LinkedList<String>();
ys.add("zero"); ys.add("one");
String y = ys.iterator().next();
// string list list
LinkedList<LinkedList<String>> zss = new
LinkedList<LinkedList<String>>();
zss.add(ys);
String z = zss.iterator().next().iterator().next();
// string list treated as byte list
Byte w = ys.iterator().next(); // compile-time error
}
}
God fornøjelse!
>
> Metoder i Java kan kun returnere een type, så derfor skal den være
> fælles for mulige retur objekter.
>
> >Thomas Mouritsen
> >
>
> vh. ld
> --
> "Time is the fire in which we burn"