Дженерики в java, расширение интерфейсов

#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 не является случайным классом и удовлетворяет некоторым условиям.