Интерфейс как тип в Java?
От Учебники Java:
В Java класс может наследовать только один класс, но он может реализовать более одного интерфейса. Поэтому объекты могут иметь несколько типов: тип их собственного класса и типы всех интерфейсов, которые они реализуют. Это означает, что если объявлена переменная тип интерфейса, его значение может ссылаться на любой объект, который созданный из любого класса, который реализует интерфейс.
Может ли кто-нибудь предоставить мне базовый псевдо-тип для этого. Я не понял смелые строки.
Ответы
Ответ 1
Объявите два интерфейса и класс, который реализует их оба:
interface I1 { }
interface I2 { }
class C implements I1, I2 { }
объекты могут иметь несколько типов
В следующем коде видно, что экземпляр C
имеет тип C
, а также I1
и I2
:
C c = new C();
boolean isC = (c instanceof C); //true
boolean isI1 = (c instanceof I1); //true
boolean isI2 = (c instanceof I2); //true
Теперь давайте объявим класс B
, который также реализует I1
:
class B implements I1 { }
Если переменная объявлена типом интерфейса, ее значение может ссылаться на любой объект, который создается из любого класса, реализующего интерфейс.
Если мы объявим переменную типа I1
, мы можем установить ее в экземпляр C
, а затем переназначить ее экземпляру B
:
I1 i1 = new C();
i1 = new B();
Мы также можем переназначить его экземпляру D
, где D
extends C
:
i1 = new D();
...
class D extends C { }
Ответ 2
Рассмотрим следующий пример:
Serializable s = new ArrayList();
В Java это действительный код, хотя Serializable
является интерфейсом, потому что ArrayList
реализует Serializable
. Поэтому в этом случае мы обрабатываем s
как переменную типа Serializable
.
Теперь предположим, что мы следуем приведенному выше коду со следующим:
s = "String object";
Это также верно, потому что String
также реализует Serializable
. Поскольку мы объявили s
как тип Serializable
, он может указывать на любой объект, который реализует этот интерфейс.
Ответ 3
объекты могут иметь несколько типов
Рассмотрим следующий фрагмент:
public class MyClass extends ParentClass implements Interface1, Interface2 {
//some code
}
Этот класс может использоваться в разных местах следующим образом:
MyClass m1 = new MyClass();
ParentClass p = new MyClass();
Interface1 i1 = new MyClass();
Interface2 i2 = new MyClass();
variable объявляется типом интерфейса, его значение может ссылаться на любой объект, который создается из любого класса, реализующего интерфейс.
Рассмотрим две последние строки в предыдущем фрагменте, переменная типа Interface1 может ссылаться на любой объект, реализующий этот интерфейс, поэтому, если у нас есть другой класс, реализующий Interface1, скажем MyClass2, тогда
Interface1 i1 = new MyClass();
Interface1 i2 = new MyClasss2();
i1 = i2;
i1 = new MyClass2();
Все предыдущие назначения действительны, поскольку MyClass и MyClass2 реализуют интерфейс1
Ответ 4
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();
Ответ 5
Заявления, которые вы указываете (откуда?), являются истинными, но вводящими в заблуждение - объекты уже имеют несколько типов без интерфейсов.
Например, "bimmelim"
имеет тип String
, но также имеет тип Object
. Интерфейсы не меняются, за исключением того, что "bimmelim"
также имеет тип Serializable
, CharSequence
и другие.
На самом деле, это, возможно, спорно, стоит ли говорить, что "bimmelim"
"имеет" тип Object
, но, конечно, ссылка на него будет вписываться в Object
переменные.
Если переменная объявляется типом интерфейса... например
CharSequence x ;
... тогда его значение может ссылаться на объект String
, такой как "bimmelim"
, или это может быть StringBuffer
, который является другим типом, который реализует CharSequence
.
Ответ 6
String
реализует несколько интерфейсов, поэтому он имеет несколько типов:
String s = "A String";
Comparable<String> comp = s;
CharSequece cs = s;
Serializable ser = s;
Интерфейс CharSequence
реализуется несколькими классами, поэтому ссылка CharSequence
может содержать все типы объектов:
CharSequence cs = "A String";
cs = new StringBuilder();
cs = new Segment();
Ответ 7
объекты могут иметь несколько типов
Пример:
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;
Пример:
Если переменная объявлена типом интерфейса, ее значение может ссылаться на любой объект, который создается из любого класса, реализующего интерфейс
Runnable r = new Foo();
r = Thread.currentThread(); //Thread implements Runnable
Ответ 8
Очень простой пример -
List<String> list1=new ArrayList<String>();
Так как ArrayList реализует List, поэтому мы можем использовать переменную интерфейса List i.e list1 для ссылки на объект, созданный Arraylist.
Ответ 9
То, что следующее правильное назначение:
class AClass implements AInterface {
}
AInterface var = new AClass();
Ответ 10
Рассмотрим следующие определения классов и интерфейсов:
public class A { }
public class B extends A implements I { }
public interface I { }
Следующие утверждения являются законными:
A first = new A();
B second = new B();
A third = new B();
I fourth = new B();
Поскольку B реализует я и расширяет A, его можно использовать как значение в любом месте, где ожидается "I" или "A".
Ответ 11
Возьмем Collection
интерфейс из стандартных библиотек Java в качестве примера. Любая переменная, объявленная как тип Collection
, может быть затем назначена объекту класса, который реализует интерфейс Collection
, например. ArrayList
, Stack
,... см. связанный документ для получения дополнительных примеров.