2011-09-01 29 views
32

De The Java Tutorials:¿Interfaz como tipo en Java?

En Java, una clase puede heredar de una sola clase, pero puede aplicar más de una interfaz. Por lo tanto, los objetos pueden tener varios tipos: el tipo de su propia clase y los tipos de todas las interfaces que implementan. Esto significa que si una variable se declara como el tipo de una interfaz, su valor puede hacer referencia a cualquier objeto que sea instanciado desde cualquier clase que implemente la interfaz.

¿Alguien puede proporcionarme un pseudo tipo básico para esto? No entendí las líneas gruesas.

Respuesta

51

Vamos a declarar dos interfaces y una clase que las implementa tanto:

interface I1 { } 

interface I2 { } 

class C implements I1, I2 { } 

objetos pueden tener múltiples tipos

En el siguiente código, se puede observar que un C instancia tiene el tipo de C, así como I1 y I2:

C c = new C(); 

boolean isC = (c instanceof C); //true 
boolean isI1 = (c instanceof I1); //true 
boolean isI2 = (c instanceof I2); //true 

Ahora vamos a declarar una clase B que implementa I1 así:

class B implements I1 { } 

si una variable se declara que es del tipo de una interfaz, su valor puede hacer referencia a cualquier objeto que se crea una instancia de cualquier clase que implemente la interfaz.

Si declaramos una variable de tipo I1, podemos configurarlo para que una instancia de C, y luego volver a asignar a una instancia de B:

I1 i1 = new C(); 
i1 = new B(); 

También puede reasignar a un instancia de D, donde D se extiende C:

i1 = new D(); 

... 

class D extends C { } 
+0

muy bien explicado – Thor

2

Las afirmaciones que cita (¿desde dónde?) Son verdaderas pero engañosas: los objetos ya tienen varios tipos sin interfaces.

Por ejemplo, "bimmelim" tiene el tipo String, pero también tiene el tipo Object. Las interfaces no cambian eso, excepto que "bimmelim"también tiene el tipo Serializable, CharSequence y otros.

En realidad, es posiblemente discutible si debemos decir que "bimmelim""tiene" el tipo Object, pero sin duda una referencia a él encajará en un Object variables.

Si una variable se declara como tipo de una interfaz ... por ejemplo

CharSequence x ; 

... entonces su valor puede hacer referencia a un objeto de String como "bimmelim", o que podría ser un StringBuffer, que es otro tipo que implementa CharSequence.

+0

+1 Estamos de acuerdo con que la cita sea engañosa. –

1

que la siguiente es una asignación correcta:

class AClass implements AInterface { 
} 


AInterface var = new AClass(); 
10

Considere el siguiente ejemplo:

Serializable s = new ArrayList(); 

En Java, esto es un código válido, a pesar de que Serializable es una interfaz, porque ArrayList implementa Serializable . Entonces, en este caso, estamos tratando s como una variable de tipo Serializable.

Ahora supongamos que seguimos el código anterior con el siguiente:

s = "String object"; 

Esto también es válido porque String también implementa Serializable. Desde que declaramos s como tipo Serializable, puede apuntar a cualquier objeto que implemente esa interfaz.

3
class Ball extends Rubber implements Jumping, Rolling, Squeezing { 
    public void jump(){} 
    public void roll(){} 
    public void squeeze(){} 
} 

Ball b = new Ball(); 
Jumping j = new Ball(); 
j.jump(); 
1

considerar las siguientes clases e interfaces definiciones:

public class A { } 

public class B extends A implements I { } 

public interface I { } 

las siguientes afirmaciones son todas legales:

A first = new A(); 
B second = new B(); 
A third = new B(); 
I fourth = new B(); 

Debido B implementa I y se extiende A, que puede ser utilizado como una valor en cualquier lugar donde se espera una "I" o una "A".

5

objetos pueden tener varios tipos

Considere el siguiente fragmento:

public class MyClass extends ParentClass implements Interface1, Interface2 {  
    //some code  
} 

Esta clase se puede utilizar en diferentes lugares de la siguiente manera:

MyClass m1 = new MyClass(); 
ParentClass p = new MyClass(); 
Interface1 i1 = new MyClass(); 
Interface2 i2 = new MyClass(); 

variable se declara a ser el tipo de una interfaz, su valor puede hacer referencia a cualquier objeto instanciado de cualquier clase que implemente la interfaz.

examinar las dos últimas líneas en el fragmento anterior, una variable de tipo Interface1 puede hacer referencia a cualquier objeto que implemente esta interfaz, por lo que si tenemos otra clase implementa Interface1, decir miclase2, entonces

Interface1 i1 = new MyClass(); 
Interface1 i2 = new MyClasss2(); 
i1 = i2; 
i1 = new MyClass2(); 

Todos las asignaciones anteriores son válidas porque MiClase y miclase2 implementa Interface1

2

String implementa varias interfaces, por lo que tiene varios tipos:

String s = "A String"; 
Comparable<String> comp = s; 
CharSequece cs = s; 
Serializable ser = s; 

La interfaz CharSequence es implementado por varias clases, por lo que una referencia CharSequence puede contener todo tipo de objetos:

CharSequence cs = "A String"; 
cs = new StringBuilder(); 
cs = new Segment(); 
1

Tome la interfaz Collection de las bibliotecas estándar de Java como un ejemplo. A cualquier variable declarada como de tipo Collection se le puede asignar un objeto de una clase que implemente la interfaz Collection, p. ArrayList, Stack, ... consulte el documento vinculado para obtener más ejemplos.

2

objetos pueden tener múltiples tipos

Ejemplo:

public class Foo implements Runnable, Callable<Integer> { 
    public void run() {} 
    public Integer call() {return 1;} 
} 

Foo foo = new Foo(); 
Runnable r = foo; 
Callable<Integer> c = foo; 

Ejemplo:

si se declara una variable a ser el tipo de una interfaz, su valor puede hacer referencia a cualquier objeto instanciado de cualquier clase que implemente la interfaz

Runnable r = new Foo(); 
r = Thread.currentThread(); //Thread implements Runnable 
2

ejemplo- muy básico

List<String> list1=new ArrayList<String>();

Dado que, ArrayList implementa Lista por lo tanto podemos usar interfaz de lista de variables es decir lista1 para referirse al objeto creado por Arraylist.