2013-07-03 25 views
5

Próbuję dowiedzieć się całego tematu generics Java.Parametry ogólnej metody Java

Dokładniej ten problem:

public class Node<E>{ 
    private E data; 
    public Node(E data){ 
     this.data=data; 
    } 
    public E get(){ 
     return this.data; 
    } 
    public void set(E data){ 
     this.data=data; 
    } 
} 

Jak mogę dodaj „rozciąga” wieloznaczny określający, że ustawić metoda może otrzymać E lub Każda klasa dziedziczenia E (w tym przypadku węzeł przytrzymaj upcasted wersję parametru).

Czy to zadziała, nawet jeśli zostawię to tak, jak jest?

(I może być nieco mylić z niezmiennego aspekcie typów generycznych.)

Dzięki!

+3

Już zrobi to, co chcesz ... –

+0

Zignorowałem pytanie. Jest to łatwe zadanie, jeśli sam wykonasz niewielką część pracy. Nie potrzebujesz nawet google, po prostu użyj ctrl-space w dowolnym Java IDE i przekonaj się sam. – Dariusz

+0

@Dariusz Możesz robić, co chcesz. Chodzi o to, że kod będzie "działał", nawet jeśli naprawdę nie wiesz, dlaczego i jak działa. Dlatego tutaj spytałem. – Paz

Odpowiedz

3

Twoja klasa już robi to, czego potrzebujesz. Pokażmy przykład. Powiedzmy, że stworzyłeś Węzeł (Number to super klasa Integer, Long itp);

Node<Number> numberNode = new Node<Number>(1); 

Można zadzwonić ustawić metodę przekazując podklasy również

numberNode.set(new Integer(1)); 
numberNode.set(new Long(1)); 
3

Ogłosiłeś swoją klasę Node<E>, gdzie już akceptuje dowolną dziedziczącą klasę E.

+2

to coś innego z przekazywaniem kolekcji jako generycznych? Ponieważ kiedy piszemy 'someMethod (ArrayList )', można przekazać tylko listę tablic z typem 'E'. –

+2

@PrasadKharkar Dobrze zauważył! Tak, są różne. – johnchen902

+0

Ohh ... dobry wtedy :) dodane do wiedzy. Dziękuję Ci –

0

Jeśli używasz

public void set(E extends SomeType){ 
this.data=data; 
} 

potem można przekazać dowolny obiekt, który implements or extends SomeType Pamiętaj, że SomeType może być również interface tutaj, nawet jeśli jest to dziwne, musimy napisać E extends SomeType.

0

Albo to będzie działać ...?

Czy masz tried it out if it works?

 final Node<Number> n = new Node<Number>(new Integer(666)); 
     System.out.println(n.get()); 
     n.set(new Integer(777)); 
     System.out.println(n.get()); 
Powiązane problemy