/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Definere returntype ved runtime
Fra : Thomas Mouritsen


Dato : 07-05-01 15:26

Jeg har et problem med at jeg skal definere retur typen idet en metoder
bliver kaldt. Se følgende kode:

ReturObject retObj; //typen der skal returneres
Vector list;

public <det jeg ikke kan finde ud af> inspect(int index)
{
return (<typecasting - hvad skal der stå her>) list.elementAt(index);
}

Det der ligger i Vector'en skal typecastes til den samme type som retObj
inden den bliver returneret;

Kan det lade sig gøre?

Mvh
Thomas Mouritsen



 
 
Lars Dam (07-05-2001)
Kommentar
Fra : Lars Dam


Dato : 07-05-01 15:35

On Mon, 7 May 2001 16:25:31 +0200, "Thomas Mouritsen"
<thomas@mouritsen.dk> wrote:

>Jeg har et problem med at jeg skal definere retur typen idet en metoder
>bliver kaldt. Se følgende kode:
>
>ReturObject retObj; //typen der skal returneres
>Vector list;
>
>public <det jeg ikke kan finde ud af> inspect(int index)
>{
> return (<typecasting - hvad skal der stå her>) list.elementAt(index);
>}
>
>Det der ligger i Vector'en skal typecastes til den samme type som retObj
>inden den bliver returneret;
>
>Kan det lade sig gøre?

public ReturObject inspect(index){
return (ReturObject)list.elementAt(index).
}

Eneste forudsætning for at det virker, er at alle dine elementer i
Vector'en skal være, eller afledt af typen 'ReturObject'.

Du kan ikke caste til den explicitte type som det enkelte objekt i
vectoren er. Dvs. det kan du godt, men det bliver castet implicit
tilbage til returtypen af din metode.

>Mvh
>Thomas Mouritsen

vh. ld

--
"Time is the fire in which we burn"

Thomas Mouritsen (07-05-2001)
Kommentar
Fra : Thomas Mouritsen


Dato : 07-05-01 16:20

Jeg er vist for uklar i min beskrivelse - jeg prøver igen.

Jeg vedlægge lidt kode for at illustrere min mening:

import java.util.*;

abstract class AbsList
{
private Vector list;

public AbsList(Object ind)
{
list = new Vector();
}

public <type> inspect(int i)
{
return (<type>) list.elementAt(i);
}

Objectet i constructoren er af en klasse - og inspect(int) skal returnere et
objekt der er typecastet til den specifikke type.

Thomas Mouritsen



Lars Dam (07-05-2001)
Kommentar
Fra : Lars Dam


Dato : 07-05-01 17:21

On Mon, 7 May 2001 17:20:14 +0200, "Thomas Mouritsen"
<thomas@mouritsen.dk> wrote:

>Jeg er vist for uklar i min beskrivelse - jeg prøver igen.
>
>Jeg vedlægge lidt kode for at illustrere min mening:
>
>import java.util.*;
>
>abstract class AbsList
>{
> private Vector list;
>
> public AbsList(Object ind)
> {
> list = new Vector();
> }
>
> public <type> inspect(int i)
> {
> return (<type>) list.elementAt(i);
> }
>
>Objectet i constructoren er af en klasse - og inspect(int) skal returnere et
>objekt der er typecastet til den specifikke type.

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.

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"

Niels Ull Harremoës (29-05-2001)
Kommentar
Fra : Niels Ull Harremoës


Dato : 29-05-01 22:15


"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"



Jonas Kongslund (30-05-2001)
Kommentar
Fra : Jonas Kongslund


Dato : 30-05-01 07:45

"Niels Ull Harremoës" wrote:
> Det er så småt på vej ind i Java - se evt JSR014

Jeg var for nogle måneder tilbage til et foredrag på Aarhus Universitet,
hvor foredragsholderen Gilad Bracha[1] meldte ud at en officiel udgave
først er på trapperne i 2002.

[1]: For de uindviede: han er medforfatter til Java Language
Specification.

--
Jonas Kongslund, http://kongslund.dk

Ole Nielsby (07-05-2001)
Kommentar
Fra : Ole Nielsby


Dato : 07-05-01 16:35


Thomas Mouritsen <thomas@mouritsen.dk> skrev:

> Jeg er vist for uklar i min beskrivelse - jeg prøver igen.
>
> Jeg vedlægge lidt kode for at illustrere min mening:
>
> import java.util.*;
>
> abstract class AbsList
> {
> private Vector list;
>
> public AbsList(Object ind)
> {
> list = new Vector();
> }
>
> public <type> inspect(int i)
> {
> return (<type>) list.elementAt(i);
> }
>
> Objectet i constructoren er af en klasse - og inspect(int) skal
> returnere et objekt der er typecastet til den specifikke type.

Det kan du ikke i Java.

Du må leve med eksplicitte typekonverteringer, eller udskyde
definitionen af inspect() til subklasser for forskellige typer.

Kort sagt: du kan lige så godt bruge din Vector direkte. Java
understøtter ikke den form for indpakning du vil lave.

ON/***Fjern sneglen fra min svaradresse***


Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste