Ci sono solo 2 posti in cui puoi dichiarare nuovi parametri di tipo generico in Java?

4

È confuso perché la dichiarazione di tipo e l'utilizzo utilizzano entrambi la sintassi <T> . Penso che ci siano solo 2 posti in cui è possibile dichiarare nuovi tipi generici in Java:

1. Nella definizione di una classe o interfaccia

class MyClass<T> ...
//           ^^^- Type declaration

interface MyInterface<T,U> ...
//                   ^^^^^- Declaring 2 types 

2. Prima di un metodo statico

// The declared type must then be used as a parameter of that method...
static <T> void foo(T t...
//     ^^^

// or as the return type:
static <T> T foo(...
//     ^^^

È vero? Sto usando le parole giuste? Devo dire "introdurre" una variabile di tipo invece di "dichiarare?" Cose come la seguente affermazione mi preoccupano:

It is possible for a constructor to be generic independently of whether the class the constructor is declared in is itself generic.

Fonte: Specifica del linguaggio Java 8.8.4. Costruttori generici

Sto provando a scrivere i limiti di generici Java , ma ho appena iniziato.

    
posta GlenPeterson 17.11.2016 - 15:55
fonte

1 risposta

4

Qualsiasi metodo che include costruttori può prendere parametri di tipo. Devo ancora vedere un caso in Java dove vorresti un costruttore generico, ma è del tutto legale dichiarare qualcosa del tipo

class Thingy {
    private final ArrayList<String> items;

    public <A> Thingy(Collection<A> values, Function<A, String> function) {
        items = new ArrayList<>(values.size());
        for (A thing : values)
            items.add(function.apply(thing));
    }
    ...
}

E invoca il costruttore come new Thingy(items, x -> x.toString()) quando ci si basa sull'inferenza di tipo o come new<Integer> Thingy(items, x -> x.toString()) quando si specifica esplicitamente il parametro type. Esatto, gli argomenti del tipo di costruttore vanno dopo la parola chiave new .

I metodi di istanza possono anche avere parametri di tipo, ad es. Potrei definire

class DataSource<T> {
  ...
  public <R> DataSource<R> transform(Function<T, R> transformation) { ... }
}

Se confrontato con altri sistemi di tipi con parametri di tipo (C ++, C #, Haskell, ...), Java non ha notevoli restrizioni riguardo ai luoghi in cui i parametri di tipo possono o non possono essere dichiarati. Invece, questo sistema basato sulla cancellazione del tipo ha notevoli restrizioni sul modo in cui questi parametri del tipo possono essere utilizzati, ad es. per quanto riguarda gli array, le clausole catch, i tipi primitivi e la mancanza di alias di tipo.

    
risposta data 17.11.2016 - 16:49
fonte

Leggi altre domande sui tag