Java-methode generiek begrip

Ik probeer te achterhalen waarom ik niet super kan gebruiken in een generieke methode-declaratie? Zie het onderstaande voorbeeld, het compileert niet, maar ik weet niet zeker waarom.

public class A {
    public  void test1(T t) {  //Compiles fine
    }
    public  void test2(T t) {    //Compilation error??
    }
    public   void test3(T t) {//Compilation error??
    }
}

class A {}
....
0
Welke fout krijg je?
toegevoegd de auteur SLaks, de bron
Syntaxisfout op token "super", verwacht
toegevoegd de auteur user1067698, de bron

2 antwoord

Denk er eens over, als een methode de handtekening zou kunnen hebben

public  void test2(T t) {
}

dan zou elk object als argument kunnen worden gebruikt. Waarom? Omdat u bijvoorbeeld altijd T kunt afleiden als Object ( Object is een supertype van A ), en elk object is een instantie van Object , dus het werkt. Dus het zo verklaren zou behoorlijk overbodig zijn. Je zou gewoon kunnen schrijven

public void test2(Object t) {
}

voor hetzelfde effect.

2
toegevoegd

Er is een verschil tussen typeparameters en typeargumenten. Het gebruik van jokertekens ( super en verlengt ) is voor typeargumenten, dat wil zeggen dat u ze op de call-site declareert wanneer u daadwerkelijk de overeenkomstige waarde van een type definieert parameter. Als alternatief kan het sleutelwoord extends worden gebruikt voor beperkingen van typeparameters.

Typ Parameters versus Type Argumenten

As such, in the definition class List{}, T is called a type parameter. Whe you a declare a reference of type List, at the call site you are allowed to provide a type argument for T, which can be an invariant (i.e. List jedis) or a wildcard with super or with extends (i.e. List<? extends Number> myNums, List<? super String> names).

Type Parameter Beperkingen

Het trefwoord extends kan ook worden gebruikt in een totaal ander doel om beperkingen voor een gegeven typeparameter te declareren. Bijvoorbeeld de verklaring:

class List{}

De typeparameter T is beperkt. Dit zou impliceren dat wanneer u een typeargument voor uw typeparameter T declareert, deze van het type CharSequence of een van de subtypen ervan moet zijn.

As such List would be valid declaration, but List would not.

The use of the keyword super is not allowed in the declaration of Type Parameter Beperkingen, probably because it does not make a lot of sense, in your declaration, what could be a valid type argument for T that is not A itself?

2
toegevoegd