Duvida de assert na pratica....e outras duvidas?

2 respostas
P

qual seria a saida para deixar compilar o codigo abaixo :

não entendi a linha

public static void add(List<? extends Shape2> l,int pos ,Rect r){
class Shape2{}
class Rect extends Shape2{}
class Circle2 extends Shape2{}
class ShadedRect extends Rect{}

public class Ex49 {

	public static void add(List<? extends Shape2> l,int pos ,Rect r){
		l.add(pos,new Shape2());
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		List<ShadedRect> l = new LinkedList<ShadedRect>();
		add(l,0,new ShadedRect());
		
	}

}

duvida no uso do assert
nunca consegui usar assert

o que estou fazendo

em cima da classe com o botão direito do mouse

  • Run AS
  • Open Run Dialog
  • Na aba Arguments
    • Program arguments = -ea
  • Botão Run

e somente sai na na console to aki …

o que estou fazendo de errado ???

public class Ex51 {

	private Boolean isValid(int i){
		if(i<1 || i>12){
			return new Boolean("Incorrect value");
		}else{
			return new Boolean(true);
		}
	}
	
	private void testValue(int val){
		
		assert isValid(val):"Out of range value";
		System.out.println("to aki ...");
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Ex51 test = new Ex51();
		test.testValue(22);
	}

}

2 Respostas

rodrigo.ferreira

Cara, o problema no Código de Generics é o seguinte:

public static void add(List<? [b]extends[/b] Shape2> l,int pos ,Rect r){   
                l.[b]add[/b](pos,new Shape2());   
     }

Pela regra de Generics, quando você utilizar o termo “? extends Classe”, você está dizendo ao compilador QUE JAMAIS MODIFICARÁ O CONTEÚDO DO CONJUNTO, apenas utilizará, SEM FAZER NENHUMA ALTERAÇÃO; logo, quando você invoca o método “add”, você está tentando adicionar algo ao conjunto tipado, o que, adivinha : Vai causar um belo erro de compilação.

Para consertar esse trecho de forma que ele compile (e funcione) corretamente, você deve usar o termo “super”, ou seja, a partir dele e todas as suas classes pais, mais nunca suas classes filhas (derivadas).

Experimente consertar para isso:

public static void add(List<? [b]super[/b] Shape2> l,int pos ,Rect r){   
                l.add(pos,new Shape2());   
     }

:slight_smile:

No caso das assertivas, o seu código está correto, só que, muito provavelmente você não está executando o seu código com as assertivas ativadas ( que é exatamente da forma como você descreveu “java -ea NomeDaClasse”.

Talvez o seu IDE não esteja configurado corretamente para executar codigo com assertivas; experimente fazer via linha de comando mesmo :slight_smile:

Espero ter ajudado !
Grande abraço !
Rodrigo.

rodrigo.ferreira

Esquecí de modificar o nome da classe, do jeito que estava o generics não seria compatível, mas este sim:

public static void add(List<? super ShadedRect> l,int pos ,Rect r){ 
                         l.add(pos,new Shape2()); 
              }

Abraço!
Rodrigo.

Criado 15 de outubro de 2008
Ultima resposta 21 de out. de 2008
Respostas 2
Participantes 2