-
Argumentos curingas podem ser limitados, assim como parâmetros de tipo, para restringir os tipos usados.
-
Curingas limitados são úteis para métodos que devem operar apenas com objetos que são subclasses de uma superclasse específica.
-
Um exemplo prático demonstra essa funcionalidade.
class A {
// ...
}
class B extends A {
// ...
}
class C extends A {
// ...
}
// Observe que D NÃO estende A.
class D {
// ...
}
- Aqui, a classe A é estendida pelas classes B e C, mas não por D.
// Classe genérica simples.
class Gen<T> {
T ob;
Gen(T o) {
ob = o;
}
}
-
Gen
usa um parâmetro de tipoT
, que especifica o tipo de objeto armazenado emob
, masT
é ilimitado e pode ser de qualquer tipo de classe. -
Para criar um método que aceite objetos
Gen<tipo>
, onde tipo éA
ou uma subclasse deA
, é necessário usar um curinga limitado. -
O método
test()
é um exemplo de como restringir o parâmetro de tipo usando um curinga limitado para aceitar apenas objetosGen<A>
ou suas subclasses.
// Aqui, o símbolo ? equivalerá a A ou a
// qualquer tipo de classe que estenda A.
static void test(Gen<? extends A> o) {
// ...
}
- A classe a seguir demonstra os tipos de objetos Gen que podem ser passados para
test( )
.
class UseBoundedWildcard {
// Aqui, o símbolo ? equivalerá a A ou a
// qualquer tipo de classe que estenda A.
static void test(Gen<? extends A> o) { // Usa um curinga limitado.
//...
}
public static void main(String args[]) {
A a = new A();
B b = new B();
C c = new C();
D d = new D();
Gen< A > w = new Gen< A >(a);
Gen< B > w2 = new Gen< B >(b);
Gen< C > w3 = new Gen< C >(c);
Gen< D > w4 = new Gen< D >(d);
//Essas chamadas são válidas porque w, w2 e w3 são subclasses de A.
test(w);
test(w2);
test(w3);
// Não pode chamar test() com w4 porque
// ele não é um objeto de uma classe que
// herde A.
//test(w4); // Error!
}
}
-
No método
main()
, objetos dos tiposA
,B
,C
eD
são criados e usados para gerar objetos Gen para cada tipo. -
O método
test()
é chamado quatro vezes, mas a última chamada é comentada. -
As três primeiras chamadas são válidas, pois os objetos w, w2 e w3 têm tipos que são
A
ou subclasses deA
. -
A última chamada é inválida porque o objeto w4 é do tipo
D
, que não é uma subclasse de A, e portanto não é aceito pelo curinga limitado detest()
. -
Para estabelecer o limite superior de um curinga, usamos
<? extends superclasse>
, onde superclasse é o tipo que define o limite. -
A cláusula
extends
é inclusiva, ou seja, a superclasse também faz parte do limite. -
Para definir um limite inferior, usamos
<? super subclasse>
, permitindo apenas classes que sejam superclasses da subclasse como argumentos. -
A cláusula super também é inclusiva.
Exemplo: WildcardSuper.java
原文链接:Curingas limitados
暂无评论内容