java - polimorfismo - Clase interna dentro de una interfaz que implementa la misma interfaz, ¿qué estamos logrando con esto?
public interface java (2)
En cuanto a la especificación de la interfaz NoCopyScan
, la clase interna que implementa la misma interfaz se puede usar como una implementación / representación predeterminada de la interfaz en cualquier lugar externo.
Una clase interna en una interfaz se trata como una clase interna estática implícitamente. Podemos crear una instancia de la clase interna de la interfaz como una clase interna estática y utilizar NoCopyScan
. Encuentre un ejemplo simple que describe el uso de la implementación predeterminada de la interfaz con la ayuda de la clase interna a continuación:
/* package whatever; // don''t place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
interface NoCopy{
public void doStuff();
public class Conc { //Inner Class
public int retStuff(){
return 2;
}
}
// public void doStuff(){
// System.out.println("Overriding in inner class");
// }
}
class ConcOut {
public int returnStuff(){
return 5;
}
public void doStuff(){
NoCopy.Conc innerObj = new NoCopy.Conc(); //Instantiating inner class
//NoCopy.Conc innerObj = (new ConcOut()).new Conc();
System.out.println("overriding in outside class ConcOut "+ innerObj.retStuff()); // calling the method of inner class
}
}
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
// your code goes here
ConcOut conObj = new ConcOut();
conObj.doStuff();
//ConcOut.Conc concInner = conObj.new Conc();
}
}
Mi pregunta:
Estaba buscando el código fuente de TextWatcher y no entendí el concepto aquí. ¿Cuál fue el punto de extender a NoCopySpan?
TextWatcher.java:
public interface TextWatcher extends NoCopySpan {
public void beforeTextChanged(CharSequence s, int start, int count, int after);
public void onTextChanged(CharSequence s, int start, int before, int count);
public void afterTextChanged(Editable s);
}
NoCopySpan.java:
package android.text;
/**
* This interface should be added to a span object that should not be copied into a new Spanned when performing a slice or copy operation on the original Spanned it was placed in.
*/
public interface NoCopySpan {
/**
* Convenience equivalent for when you would just want a new Object() for
* a span but want it to be no-copy. Use this instead.
*/
public class Concrete implements NoCopySpan {}
}
NoCopySpan
es solo una interfaz de marcador . Según javadoc, se utiliza para modificar el comportamiento de la rutina de copia de los objetos Spanned
(se basa en el tipo de componentes). Por ejemplo, android.text.SpannableStringBuilder
utiliza dicha información de herencia para omitir la copia en la construcción.
Este enfoque tiene algunos inconvenientes pero sigue siendo bastante común. La razón de la existencia de la clase Concrete
es proporcionar una forma conveniente de construir la realización ficticia (o predeterminada) en la NoCopySpan
interfaz NoCopySpan
.