[Java] Kort generics vraagje

Pagina: 1
Acties:

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Topicstarter
Hoi, ik ben bezig met een kleine methode, die uit een Set het ding met een null-waarde retourneert. Ik wil dat er ook een fatsoenlijke waarde terugkomt wanneer de Set leeg is:

code:
1
2
3
4
5
6
7
8
9
10
    public IDing getNullwaarde(Set<? extends IDing> dingen) {
        Iterator<? extends IDing> it = dingen.iterator();
        while (it.hasNext()) {
            IDing ding = it.next();
            if (ding.getWaarde()==null) return ding;
        }
        
        //Er zijn nog geen dingen --> eentje maken
        return new ...();
    }


Wat moet er op de puntjes om ervoor te zorgen dat er een nieuw IDing wordt aangemaakt dat van het type <? extends IDing> is, wat ik binnenkrijg als parameter?

Ik kan deze methode aanroepen met een Set van Grotedingen, Kleinedingen, Raredingen etc. Als de set leeg was moet er dus een Grootding, Kleinding of Raarding worden geretourneerd, afhankelijk van wat er in kwam. Kan dat uberhaupt?

Siditamentis astuentis pactum.


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:44
In .NET zou het afaik kunnen, dus waarom in Java niet ?
Ik vind dat vraagteken wel vreemd, ik ben nu wel niet bekend met Java, kan je dat niet zo doen:
code:
1
public IDing getNullwaarde( Set<T extends IDing> dingen)

?
En, is het niet beter dat je, ipv IDing returned, dan een type T returned ?

Als dit mogelijk is, dan moet het toch gewoon mogelijk zijn om op regel 9 dit te doen:
code:
1
return new T();

denk ik.... Maar, dan moet je er wel voor zorgen dat je een publieke default constructor hebt...

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Volgens mij kan dat niet. Het enige wat je van je type weet is dat hij IDing implementeerd. Je weer verder dus niet aan welke voorwaarden dat type doet en kan dus ook niet garanderen dat alle types die je er aan meegeeft een default constructor hebben.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:44
rwb schreef op vrijdag 31 maart 2006 @ 11:34:
Volgens mij kan dat niet. Het enige wat je van je type weet is dat hij IDing implementeerd. Je weer verder dus niet aan welke voorwaarden dat type doet en kan dus ook niet garanderen dat alle types die je er aan meegeeft een default constructor hebben.
Da's waar. Je kan idd niet in je interface specifieren dat IDing een default constructor moet hebben.
Je kan dit natuurlijk wel via reflection forceren...

https://fgheysels.github.io/


  • RSchellhorn
  • Registratie: Augustus 2001
  • Laatst online: 21-02 15:36
die notatie zou in java zijn

Java:
1
2
3
public <T extends IDing> T getNullWaarde(Set<T> dingen) {
...
}


Je kan (helaas, maar logisch volgens mij) geen objecten aanmaken met alleen hun generic type. Misschien met reflection wel, maar dat zou ik niet zeker durven zeggen.

[ Voor 5% gewijzigd door RSchellhorn op 31-03-2006 11:41 . Reden: te laat ]

"Ik heb zo veel soep gegeten, dat kan een mens niet aan. Ik heb zo veel soep gegeten, kan bijna niet meer staan. Ik zat daar maar te slurpen achter die grote kop en als ik bijna klaar was, dan schepten ze weer op!" (Hans Teeuwen)


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
whoami schreef op vrijdag 31 maart 2006 @ 11:39:
[...]


Da's waar. Je kan idd niet in je interface specifieren dat IDing een default constructor moet hebben.
Je kan dit natuurlijk wel via reflection forceren...
Ja idd je zou via reflection denk wel een instance van het object kunnen maken.

Of als je aantal types beperkt is zou je het mischien door middel van een factory die een type als parameter aanneemt op kunnen lossen.

[ Voor 18% gewijzigd door Woy op 31-03-2006 11:41 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Topicstarter
whoami schreef op vrijdag 31 maart 2006 @ 11:25:
In .NET zou het afaik kunnen, dus waarom in Java niet ?
Ik vind dat vraagteken wel vreemd, ik ben nu wel niet bekend met Java, kan je dat niet zo doen:
code:
1
public IDing getNullwaarde( Set<T extends IDing> dingen)

?
Nee, dat kan niet.. dat had ik al geprobeerd.

Ik denk dat het helemaal niet kan zelfs, als ik de pfd van Sun zelf moet geloven:
<T> T[] makeArray(T t) { return new T[100]; // error
}
new T() gaat dus helemaal niet.

Ik denk dat ik 't dan maar met wat lelijker code moet oplossen. :)

Siditamentis astuentis pactum.


  • RSchellhorn
  • Registratie: Augustus 2001
  • Laatst online: 21-02 15:36
Als ik je algorithme begrijp wil je de eerste instantie van IDing terug geven, die als waarde null heeft?

Als er geen IDing in de set zit met waarde==null, dan is het toch logischer om null terug te geven?

Oftewel, volgens mij hoef je helemaal geen object te instantieren....

"Ik heb zo veel soep gegeten, dat kan een mens niet aan. Ik heb zo veel soep gegeten, kan bijna niet meer staan. Ik zat daar maar te slurpen achter die grote kop en als ik bijna klaar was, dan schepten ze weer op!" (Hans Teeuwen)


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Slayer08 schreef op vrijdag 31 maart 2006 @ 11:44:
Als er geen IDing in de set zit met waarde==null, dan is het toch logischer om null terug te geven?

Oftewel, volgens mij hoef je helemaal geen object te instantieren....
Het IDing zelf is natuurlijk wel interessant ;) Bijvoorbeeld om de waarde te veranderen.

Maar helaas is het niet echt mogelijk zoiets te doen zonder reflection, en zelfs dan is het niet helemaal triviaal uit te zoeken. Ik heb het zelf wel eens geprobeerd om ook een generieke constructor in een generieke factory te hebben, maar dat viel flink tegen en uiteindelijk heb ik het toen maar anders opgelost.
Het probleem is dat die generieke clauses op het moment van compileren, maar niet meer tijdens de executie bekend zijn.

  • RSchellhorn
  • Registratie: Augustus 2001
  • Laatst online: 21-02 15:36
ACM schreef op vrijdag 31 maart 2006 @ 12:36:
[...]

Het IDing zelf is natuurlijk wel interessant ;) Bijvoorbeeld om de waarde te veranderen.
Opzich true, maar...volgens mij is het bad behaviour als een methode getNullWaarde(Set) een object aanmaakt die niet in de set zit en die terug geeft als resultaat op de vraag "Geef me het eerste object in de set die als waarde null heeft".

Het aanmaken zou ik dan ook hoger in programma doen, b.v.:

Java:
1
2
3
4
5
6
IDing ding = getNullWaarde( de_set );
if( ding == null ) {
    ding = new ConcreteDing();
    de_set.add(ding);
}
// etc

"Ik heb zo veel soep gegeten, dat kan een mens niet aan. Ik heb zo veel soep gegeten, kan bijna niet meer staan. Ik zat daar maar te slurpen achter die grote kop en als ik bijna klaar was, dan schepten ze weer op!" (Hans Teeuwen)


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Topicstarter
Het zou inderdaad vies zijn om het algoritme dat de nullwaarde in een verzameling zoekt eventueel een element in die verzameling te laten zetten.

Ik heb er even over nagedacht, en ik denk dat het de beste oplossing is om de constructor van die verzameling alvast een elementje te laten toevoegen. Dat maakt tevens dat altijd aan mijn eis '1 element met een nullwaarde' wordt voldaan.

Siditamentis astuentis pactum.

Pagina: 1