Java >> Java tutorial >  >> Java

Java generiske:flere generiske parametre?

Ja - det er muligt (dog ikke med din metodesignatur) og ja, med din signatur skal typerne være de samme.

Med den signatur du har givet, T skal være knyttet til en enkelt type (f.eks. String eller Integer ) på opkaldsstedet. Du kan dog erklære metodesignaturer, der tager flere typeparametre

public <S, T> void func(Set<S> s, Set<T> t)

Bemærk i ovenstående signatur, at jeg har erklæret typerne S og T i selve signaturen. Disse er derfor forskellige fra og uafhængige af generiske typer forbundet med klassen eller grænsefladen, som indeholder funktionen.

public class MyClass<S, T> {
   public        void foo(Set<S> s, Set<T> t); //same type params as on class
   public <U, V> void bar(Set<U> s, Set<V> t); //type params independent of class
}

Du vil måske gerne tage et kig på nogle af metodesignaturerne for samlingsklasserne i java.util pakke. Generisk er egentlig et ret kompliceret emne, især når jokertegn (? extends og ? super ) overvejes. For eksempel er det ofte tilfældet, at en metode, der kan tage en Set<Number> som parameter bør også acceptere en Set<Integer> . I så fald vil du se en signatur som denne:

public void baz(Set<? extends T> s);

Der er allerede masser af spørgsmål på SO, som du kan se på om emnet!

  • Java Generics:Liste, Liste, Liste
  • Java Generics (Jokertegn)
  • Hvad er forskellene mellem Generics i C# og Java... og skabeloner i C++?

Ikke sikker på, hvad meningen med at returnere en int fra funktionen er, selvom du kan gøre det, hvis du vil!


Du kan erklære flere typevariabler på en type eller metode. For eksempel ved at bruge typeparametre på metoden:

<P, Q> int f(Set<P>, Set<Q>) {
  return 0;
}

Endnu mere, du kan arve generiske lægemidler :)

@SuppressWarnings("unchecked")
public <T extends Something<E>, E extends Enum<E> & SomethingAware> T getSomething(Class<T> clazz) {
        return (T) somethingHolderMap.get(clazz);
    }

Java tag