Maneira de instanciar uma interface

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

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).

1 curtida

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

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.

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 $.

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

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