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.
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 { }
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.
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 1Warning: 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();
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
.
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();
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
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.
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();
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".
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.
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