Interfejs jako typ w Javie?

From The Java Tutorials :

W Javie klasa może dziedziczyć tylko z jednej klasy, ale może zaimplementować więcej niż jeden interfejs. Dlatego obiekty mogą mieć wiele typów : typu własnej klasy oraz typów wszystkich interfejsów, które realizują. Oznacza to, że jeśli zmienna jest zadeklarowana jako typu interfejsu, jego wartość może odwoływać się do dowolnego obiektu, który jest utworzone z dowolnej klasy, która implementuje interfejs .

Czy ktoś może podać mi podstawowy pseudo typ do tego. Nie rozumiałem śmiałych linii.

Author: Paul Bellora, 2011-09-02

11 answers

Zadeklarujmy dwa interfejsy i klasę, która je implementuje:

interface I1 { }

interface I2 { }

class C implements I1, I2 { }

obiekty mogą mieć wiele typów

W poniższym kodzie widać, że instancja C mA typ C oraz I1 i I2:

C c = new C();

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

Teraz zadeklarujmy klasę B, która implementuje I1 również:

class B implements I1 { }

jeśli zmienna jest zadeklarowana jako typ interfejsu, jej wartość może odwoływać się do dowolnego obiektu, który jest utworzone z dowolnej klasy implementującej interfejs.

Jeśli zadeklarujemy zmienną typu I1, możemy ustawić ją na instancję C, a następnie ponownie przypisać ją do instancji B:

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

Możemy również przypisać go do instancji D, gdzie D rozciąga się C:

i1 = new D();

...

class D extends C { }
 51
Author: Paul Bellora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-01 21:03:31

Rozważ następujący przykład:

Serializable s = new ArrayList();

W Javie jest to poprawny kod, mimo że Serializable jest interfejsem, ponieważ ArrayList implementuje Serializable. W tym przypadku traktujemy s jako zmienną typu Serializable.

Teraz Załóżmy, że podążamy za powyższym kodem z następującym:

s = "String object";

Jest to również ważne, ponieważ String również implementuje Serializable. Ponieważ zadeklarowaliśmy {[5] } jako typ Serializable, może wskazywać na dowolny obiekt , który implementuje ten interfejs.

 10
Author: Mansoor Siddiqui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-01 20:13:47

Obiekty mogą mieć wiele typów

Rozważ następujący fragment:

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

Klasa ta może być używana w różnych miejscach w następujący sposób:

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

Zmienna jest deklarowana jako typ interfejsu, jej wartość może odwoływać się do dowolnego obiektu, który jest instancją z dowolnej klasy implementującej interfejs.

Rozważmy dwie ostatnie linie w poprzednim fragmencie, zmienna typu Interface1 może odwoływać się do dowolnego obiektu implementującego ten interfejs, jeśli więc mamy inną klasę implementującą Interface1, powiedzmy MyClass2, to

Interface1 i1 = new MyClass();
Interface1 i2 = new MyClasss2();
i1 = i2;
i1 = new MyClass2();
Wszystkie poprzednie zadania są ważne, ponieważ MyClass i MyClass2 implementują interfejs 1
 5
Author: K'',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 11:13:47
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();
 3
Author: bragboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-01 20:08:29

Wypowiedzi, które cytujesz (skąd?) są prawdziwe, ale mylące - obiekty mają już wiele typów bez interfejsów.

Na przykład, "bimmelim" mA typ String, ale ma również typ Object. Interfejsy tego nie zmieniają, poza tym, że "bimmelim" również mA typ Serializable, CharSequence i inni

Właściwie, to może być dyskusyjne, czy powinniśmy powiedzieć, że "bimmelim" "ma" typ Object, ale z pewnością odniesienie do niego zmieści się w Object zmienne.

Jeśli zmienna jest zadeklarowana jako typ interfejsu ... na przykład

CharSequence x ;

... następnie jego wartość może odwoływać się do String obiektu, takiego jak "bimmelim", lub może być StringBuffer, który jest innym typem implementującym CharSequence.

 2
Author: Henning Makholm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-01 20:07:12

String implementuje wiele interfejsów, więc ma wiele typów:

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

Interfejs {[3] } jest zaimplementowany przez wiele klas, więc Referencja CharSequence może pomieścić wszystkie rodzaje obiektów:

CharSequence cs = "A String";
cs = new StringBuilder();
cs = new Segment();
 2
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-01 20:11:26

Obiekty mogą mieć wiele typów

Przykład:

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;

Przykład:

Jeśli zmienna jest zadeklarowana jako typ interfejsu, jej wartość może odwoływać się do dowolnego obiektu, który jest instancją z dowolnej klasy implementującej interfejs

Runnable r = new Foo();
r = Thread.currentThread();   //Thread implements Runnable
 2
Author: Tomasz Nurkiewicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-01 20:11:47

Bardzo podstawowy przykład -

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

Ponieważ ArrayList implementuje List dlatego możemy użyć zmiennej interfejsu List TJ list1 aby odnieść się do obiektu wytworzonego przez Arraylist.

 2
Author: JYOTI PRAKASH Maurya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-16 05:24:55

Że poniższe zadanie jest poprawne:

class AClass implements AInterface {
}


AInterface var = new AClass();
 1
Author: Simone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-01 20:07:17

Rozważ następujące definicje klas i interfejsów:

public class A { }

public class B extends A implements I { }

public interface I { }

Wszystkie poniższe stwierdzenia są legalne:

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

Ponieważ B implementuje I i rozszerza A, może być używana jako wartość wszędzie tam, gdzie oczekuje się "I" lub "A".

 1
Author: Mike Daniels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-01 20:08:44

Weź Collection interfejs ze standardowych bibliotek Javy jako przykład. Każda zmienna zadeklarowana jako typ Collection może być następnie przypisana obiektowi klasy, która implementuje interfejs Collection, np. ArrayList, Stack, ... więcej przykładów można znaleźć w linked doc.

 1
Author: Oben Sonne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-01 20:11:27