Maneira de instanciar uma interface

6 respostas
labbati

Pessoal antes de ver esta questão do test Killer achava que não era possivel instanciar uma interface. Segue a questão 15:

Question 15
Given: 
10. interface Foo { int bar(); } 
11. public class Sprite { 
12. public int fubar( Foo foo) { return foo.bar(); } 
13. public void testFoo() { 
14. fubar( 
15. // insert code here 
16.); 
17. } 
18. } 
Which code, inserted at line 15, allows the class Sprite to compile? 
A. Foo { public int bar() { return 1; } } 
B. new Foo { public int bar() { return 1; } } 
C. newFoo() { public int bar(){return 1; } } 
D. new class Foo { public int bar() { return 1; } }

A resposta correta é a letra C. Alguem pode me dar uma explicação conceitual porque isto funciona, ja que eu achava que a interface é um comportamento e nao pode ser instanciado.

Segue a implementação que utilizei para teste

public interface Foo {
	int bar();
}

public class Sprite {
	public int fubar(Foo foo){
		return foo.bar();
	}
	
	public void testFoo(){
		fubar(new Foo(){@Override
		public int bar() {
			return 1;
		}});
	}
}

Obrigado

6 Respostas

T
new Foo() { public int bar(){return 1; } }

De fato, uma interface não pode ser instanciada, mas uma classe (mesmo que anônima, ou seja, sem nome) que implementa essa interface pode ser instanciada.

new Foo() { 
    public int bar() {   
        return 1;
    }
}

é uma abreviação para:

class Sprite$1 implements Foo {
    public int bar() {
        return 1;
    }
}
...

new Sprite$1()

onde Sprite$1 é o nome que o compilador atribuiu a uma “classe anônima” (ou seja, você não deu o nome a ela, mas o compilador arbitrariamente deu um nome - para a JVM, todas as classes devem ter nomes, mesmo que inventados).

pintofree

Na verdade ele nao instaciou a interface, o que aconteceu foi que ele criou uma subclasse estendendo da interface.

T

Se você olhar os arquivos .class que foram gerados pelo compilador após uma compilação de código que tenha classes anônimas, vai ver que realmente o compilador criou alguns arquivos ___$1.class, ___$2.class e assim por diante. (Onde ____ é o nome da classe onde apareceu a tal da classe anônima). No seu exemplo iria aparecer um arquivo Sprite$1.class.

labbati

Obrigado a todos pela resposta, fiquei muito satisfeito com os comentários. Verifiquei no diretorio de .class e realmente tem uma classe la com este nome com $.

B

Preciso de saber como carregar um objecto da classe dao para a interface (jText), alguem pode me ajudar?

rafadelnero

Valeu pela explicação, não sabia que as classes anônimas recebiam nomes nos arquivos .class, é sempre ótimo entender a fundo os conceitos!

Criado 7 de maio de 2009
Ultima resposta 29 de jan. de 2013
Respostas 6
Participantes 5