Toon posts:

[java]generics niet zo generic

Pagina: 1
Acties:

Verwijderd

Topicstarter
De laatste dagen heb ik mij verdiept in de "nieuwe" java versie 1.5.0. Nu zou ik graag generics toepassen op mijn huidig project omdat die goed van pas zou komen!

Situatie:
classe DataMap: hierin worden mappins van colummen bijgehouden, maar die is nu niet relevant. Het belangrijkste is dat er een referentie wordt bijgehouden van welke klasse hij de datamap bijhoudt!
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class DataMap<T>{
    private Class<T> domainClass;
    private String tableName;
    private List columnMaps = new ArrayList();


    public DataMap(Class<T> domainClass, String tableName) {
        this.domainClass = domainClass;
        this.tableName = tableName;
    }

    public void setDomainClass(Class<T> domainClass) {
        this.domainClass = domainClass;
    }

    public void setTableName(String tableName) {
        this.tableName = tableName;
    }
    public T getInstanceOfDomain(){
        try {
            return domainClass.newInstance();
        } catch (InstantiationException e) {
          
        } catch (IllegalAccessException e) {
          
        }
        return null;
    }

    public Class<T> getDomainClass() {
        return domainClass;
    }
}


Nu als ik deze code wil gebruiken compiled hij niet (wegens generics probleem dus)

Java:
1
2
DataMap d = new DataMap<Customer>(Customer.class,"customer");
Customer c = d.getInstanceOfDomain();

Normaal zou er door methode getInstanceOfDomain een T moeten worden teruggeven, in mijn geval dus "customer". Maar hij geeft volgens de compiler een "object " terug.
Als ik de methode intern oproep (in de klasse datamap) dan geeft hij WEL T terug.

Ow ja: volgende code zou toch ook moeten werken? Ze is beetje korter :)

Java:
1
DataMap d = new DataMap(Customer.class,"customer");


Dus zonder de <Customer>.
dit is een quote van de java generics tutorial.
Notice that we don’t have to pass an actual type argument to a generic method. The
compiler infers the type argument for us, based on the types of the actual arguments. It
will generally infer the most specific type argument that will make the call type-correct.

Dus ik dacht dat ik ook gelde voor constructors en niet alleen methods

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Verwijderd schreef op vrijdag 26 november 2004 @ 14:04:
Nu als ik deze code wil gebruiken compiled hij niet (wegens generics probleem dus)

Java:
1
2
DataMap d = new DataMap<Customer>(Customer.class,"customer");
Customer c = d.getInstanceOfDomain();
Het type van d moet DataMap<Customer> zijn.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Waarom wil je eigenlijk expliciet de Class<T> opslaan en moeten opgeven? Kun je dat niet gewoon van je T afleiden?

  • MNeMoNiCS
  • Registratie: Mei 2002
  • Laatst online: 16-10-2012
Probeer eens:

code:
1
DataMap<Customer> d = new DataMap<Customer>(Customer.class,"customer");

  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 23:25
Als ik het zo zie, komt dat door erasure. Kort gezegd, aan de binnenkant van het object bestaat <T> als Object. De Generics zijn een schil om alles heen die het Object autocasten naar T zodra het buiten gaat. Aan de binnenkant kun je dus niet meer zien, wat T is, behalve als je dat zelf expliciet meegeeft. Zie o.a. http://mindview.net/WebLog/log-0055 voor een zeer uitgebreide lezing van Bruce Eckel hierover. Hij heeft ook een boel andere weblogs hierover geschreven, zeer aan te raden en ontzettend leerzaam.