Erro na apostila da Katty Sierra

9 respostas
nekiess

.:N:.


Eu estou seguindo a apostila e captando bem o explicado, agora tem um exercicio que irei postar abaixo que a resposta esta errada na apostila… quando vi o enunciado respondi conforme eu tinha visto na apostila, e acreditei ter acertado… quando fui ver a resposta… surpresa! Minha resposta esta errada… mas bah, eu digitei o código pois queria ver se estava errado mesmo, e outra surpresa a apostila esta errada, ou eu acho… vou postar aq para ver se alguem comenta algo sobre isso, se eu estou errado por não ter percebido algo ou é erro da apostila mesmo.
.
.
.
segue o codigo.
.
.
.
.

package Seiken;

public class Teste {
	static String s="";
	public static void main(String[] args)
	{
		int x=4;
		Boolean y=true;
		short[] sa={1,2,3};
		doStuff(x,y);
		doStuff(x);
		doStuff(sa,sa);
		System.out.println(s);
	}
	static void doStuff(Object o)
	{
		s+="1";
	}
	
	static void doStuff(Object... o)
	{
		s+="2";
	}
	
	static void doStuff(Integer... i)
	{
		s+="3";
	}
	
	static void doStuff(long L)
	{
		s+="4";
	}

}

Qual o resultado?
A 212
B 232
C 234
D 312
E 332
F 334
G Ocorre falha na compilação.
.
a resposta da apostila é:
A Esta correta. É uma operação legal fazer o boxing e, em seguida, ampliar. O primeiro chamado para doStuff() faz o boxing de int par aum Integer, em seguida, passa dos objetos. O segundo chamado não pode ser ampliado (tornando o método Long inútil), então, ele faz o boxing de int em um Integer. Como sempre, ao transmitir dosi objetos, eles são do tipo array de short.
.
.
só que a resposta da apostila esta errada dammit! A resposta é 242…
.
postei isso aq só para ver SE alguem irá comentar algo, se eu deixei de ver algo… sei lá, de qualquer forma tendo ou não respostas esta ai, um erro na apostila.
.
Obs: Digitei exatamente igual a apostila.


.:N:.

9 Respostas

visola

Olá nekiess. Fiz um teste aqui e a resposta deu de acordo com a da apostila.
Verifica aí se está correto sua digitação. O método que recebe o long é um Objeto ou um primitivo? Ou seja:

static doStuff(Long long) {...

// ou 

statid doStuff(long long) {...

Se for o primeiro caso o resultado foi 212 como a apostila disse. Se for o segundo aí caí na resposta que você está falando.

Acho que o que a apostila quis ressaltar é que Integer não pode ser transformado num Long já que ambos descendem de Number mas não um do outro.

mapleplayer

212 é a resposta correta

A primeira chamada a doStuff vai invocar doStuff(Object… o) porque um int e um Boolean são fornecido, o int é embrulhado em um Integer, Integer e Boolean são Object, a passagem dos argumentos bate com a assinatura do método doStuff(Object… o)

A segunda chamada a doStuff vai invocar doStuff(Object o) porque um int é fornecido como argumento, mas não existe um método doStuff que espera por um int, mas existe soStuff que espera por um Object, o int é embrulhado em um Integer e Integer é um Object. Você pode pensar mas então porque não entrou no método doStuff(Integer… i) ? Por motivo de compatibilidade com versões anteriores ao java, lembre se que em overload de métodos, o método de tamanho variável de argumentos vai ser sempre a última opção da JVM

A terceira chamada a doStuff vai invocar doStuff(Object… o) porque duas arrays são fornecidas como argumentos, não existe um método doStuff que espera por duas arrays mas existe doStuff que espera por uma lista de tamanho variável de argumentos do tipo Object, o qual se encaixa com os argumentos fornecidos(as duas arrays).

Se pensa em tirar o certificado como eu, vai a minha dica em qualquer coisa, nunca pense que você é o melhor, o mais esperto e tal. Não encare como ofensa.

Espero ter ajudado.

nekiess

.:N:.


Rs… quando eu comentei que tinha entendido o conteúdo não foi no sentido de, digamos, “esnobar” a apostila… longe disso, é que este conteúdo ficou bem claro e acho que entendi pelo menos a base rs, na apostila tem um erro que é de digitação… o metodo com long como parametro não deveria ser long, porem Long… ficaria assim doStuff(Long l) e não o doStuff(long l) como esta… por isso não tinha entendido, mas ta certo mesmo, se fosse long minusculo daria o resultado que falei.
.
Só criei o post para ver onde poderia estar o erro… agora esta tudo nos conformes :).
.
Valeu pela ajuda galera!
See ya!


.:N:.

denislima

nekiess:
.:N:.


Rs… quando eu comentei que tinha entendido o conteúdo não foi no sentido de, digamos, “esnobar” a apostila… longe disso, é que este conteúdo ficou bem claro e acho que entendi pelo menos a base rs, na apostila tem um erro que é de digitação… o metodo com long como parametro não deveria ser long, porem Long… ficaria assim doStuff(Long l) e não o doStuff(long l) como esta… por isso não tinha entendido, mas ta certo mesmo, se fosse long minusculo daria o resultado que falei.
.
Só criei o post para ver onde poderia estar o erro… agora esta tudo nos conformes :).
.
Valeu pela ajuda galera!
See ya!


.:N:.

Fico meio confuso… na apostila ta long ou Long?

nekiess

denislima:
nekiess:
.:N:.


Rs… quando eu comentei que tinha entendido o conteúdo não foi no sentido de, digamos, “esnobar” a apostila… longe disso, é que este conteúdo ficou bem claro e acho que entendi pelo menos a base rs, na apostila tem um erro que é de digitação… o metodo com long como parametro não deveria ser long, porem Long… ficaria assim doStuff(Long l) e não o doStuff(long l) como esta… por isso não tinha entendido, mas ta certo mesmo, se fosse long minusculo daria o resultado que falei.
.
Só criei o post para ver onde poderia estar o erro… agora esta tudo nos conformes :).
.
Valeu pela ajuda galera!
See ya!


.:N:.

Fico meio confuso… na apostila ta long ou Long?

.
.
.
.
Na apostila esta long minusculo… por isso que eu não estava entendendo o erro… deveria ser Long maiusculo.
na apostila estava:
doStuff(long l)
.
e deveria ser:
doStuff(Long l)
.

mapleplayer

pág 273 da apostila

public class Bertha {
  static String s = "";
  public static void main(String[] args) {
    int x = 4; Boolean y = true; short[] sa = {1,2,3};
    doStuff(x, y);
    doStuff(x);
    doStuff(sa, sa);
    System.out.println(s);
  }
  static void doStuff(Object o) { s += "1"; }
  static void doStuff(Object... o) { s += "2"; }
  static void doStuff(Integer... i) { s += "3"; }
  static void doStuff(Long L) { s += "4"; }
}
mapleplayer

Nota: A apostila que estou lendo está em Inglês

denislima

nekiess:
denislima:
nekiess:
.:N:.


Rs… quando eu comentei que tinha entendido o conteúdo não foi no sentido de, digamos, “esnobar” a apostila… longe disso, é que este conteúdo ficou bem claro e acho que entendi pelo menos a base rs, na apostila tem um erro que é de digitação… o metodo com long como parametro não deveria ser long, porem Long… ficaria assim doStuff(Long l) e não o doStuff(long l) como esta… por isso não tinha entendido, mas ta certo mesmo, se fosse long minusculo daria o resultado que falei.
.
Só criei o post para ver onde poderia estar o erro… agora esta tudo nos conformes :).
.
Valeu pela ajuda galera!
See ya!


.:N:.

Fico meio confuso… na apostila ta long ou Long?

.
.
.
.
Na apostila esta long minusculo… por isso que eu não estava entendendo o erro… deveria ser Long maiusculo.
na apostila estava:
doStuff(long l)
.
e deveria ser:
doStuff(Long l)
.

Entendi valeu!

fallows…

nekiess

mapleplayer:
pág 273 da apostila

public class Bertha { static String s = ""; public static void main(String[] args) { int x = 4; Boolean y = true; short[] sa = {1,2,3}; doStuff(x, y); doStuff(x); doStuff(sa, sa); System.out.println(s); } static void doStuff(Object o) { s += "1"; } static void doStuff(Object... o) { s += "2"; } static void doStuff(Integer... i) { s += "3"; } static void doStuff(Long L) { s += "4"; } }

.
.
A minha é em portugues, pagina 160, e o long de doStuff é minusculo… são os erros de tradução.

Criado 21 de fevereiro de 2011
Ultima resposta 21 de fev. de 2011
Respostas 9
Participantes 4