#java #interface #extend
#java #интерфейс #расширить
Вопрос:
В приведенном ниже коде:
class A<T extends InterfaceA amp; InterfaceB>
что значит «T должен быть типом InterfaceA»?
например, следующий код:
class A<T extends Number>
означает, что T может быть int, double или любым другим числовым типом.
может кто-нибудь привести мне пример, объясняющий первый код?
Комментарии:
1. Вы пробовали это в своей IDE и смотрели, что вы получаете от этого?
2. Пожалуйста, следуйте соглашениям об именовании Java,
InterfaceA
а неinterfaceA
.3. да, я пробовал, но я не понимаю, что это значит? имеет ли интерфейс какой-либо тип, который может расширяться от него?
4. @Shakiba-Проверьте мой код, я надеюсь, это поможет вам понять, почему может быть передан только определенный тип, который реализует оба интерфейса, InterfaceA и InterfaceB в вашем случае! Если вы не понимаете, пожалуйста, укажите на меня!
5. @shekharsuman — Все было ясно, я получил код!
Ответ №1:
В нем говорится T
, что должен быть тип, который реализует оба interfaceA
и interfaceB
интерфейсы.
В вашем втором примере говорится, что T
это должно быть любого типа, который реализует Number
только интерфейс.
Ответ №2:
class A<T extends interfaceA amp; interfaceB>
означает
это T ограничено двумя интерфейсами. Таким образом, любой аргумент типа, передаваемый в T , должен реализовывать interfaceA
и interfaceB
.
Пример программы для вашего понимания :-
interface X{
public void eat();
}
interface Y{
public void drink();
}
class XYZ implements X,Y{
@Override
public void eat(){
System.out.println("I am eating.");
}
@Override
public void drink(){
System.out.println("I am drinkin too!");
}
}
class A<T extends X amp; Y> {
public void display(){
XYZ x=new XYZ();
x.eat();
x.drink();
System.out.println("Type of XYZ is " x.getClass().getName());
}
}
public class Sample1{
public static void main(String[] args) {
A<XYZ> a=new A<>();
a.display();
}
}
Это означает, что тип, аргумент которого передается в T, должен реализовывать интерфейсы X и Y.
Как показано в данном коде :-
A<XYZ> a=new A<>(); //here only XYZ(substituted in place of T) can be passed because it implements both interface X and interface Y
Я надеюсь, что это поможет вам понять и указать на различия!!!
Комментарии:
1. Я попробовал это в своей IDE, но у него проблема со строкой A<XYZ> a=new A<>();
2. @Shakiba- Какую версию Java вы используете? А также, с какой IDE с какой строкой или с какой ошибкой вы столкнулись???
3. @Shakiba — Не могли бы вы принять ответ, чтобы мы оба могли заработать репутацию! Пожалуйста, подумайте, только если вы были удовлетворены моим ответом!
4. @Shakiba — Вы тоже можете проголосовать за мои ответы, если удовлетворены, пожалуйста! Спасибо.
Ответ №3:
Я бы пошел с примером @shekhar suman, но я бы изменил последний класс и основной:
class A<T extends X amp; Y> {
public void display(T t){
t.eat();
t.drink();
System.out.println("Type of T is " t.getClass().getName());
}
}
public static void main(String[] args) {
A<XYZ> a=new A<>();
a.display(new XYZ());
}
Ответ №4:
Если бы не было таких расширений: Класс A<T> Класс A был универсальным классом, принимающим любой класс T.
Однако в случае класса A<T расширяет InterfaceA amp; InterfaceB> T может быть любым классом, который реализует как InterfaceA, так и InterfaceB .
Другими словами, вы хотите убедиться, что T не является случайным классом и удовлетворяет некоторым условиям.