2015-11-13 4 views
4

Не понимаю, почему Company скомпилирован. Я думал, что это проверено на extends, но не для implements?Общий расширяет и реализует

public interface Employee 

public class HourlyEmployee implements Employee 

public class Company<T extends Employee> 

Company<HourlyEmployee> company = new Company<>(); 

ответ

8

Ключевое слово extends в Generics имеет несколько отличную семантику, чем общее ключевое слово extends.

При использовании extends в контексте Generics, например T extends Something, это означает, что T должен быть типом, который либо реализует интерфейс Something (в случаях, когда Something является интерфейс), или является подклассом Something (в случае, если Something - это класс).

Возможно, причина в том, что если ключевое слово implements было поддержано в Generics, это сделало бы объявление параметра типа слишком подробным.

Например, вы бы:

<T extends SomeClass implements Serializable & Observable> 

Вместо этого, действительный синтаксис для этого будет:

<T extends SomeClass & Serializable & Observable> 

И вам не нужно иметь implements ключевое слово, на самом деле. При определении границ типа T вам просто нужно указать, какие типов имеет тип T, не заботясь, если это интерфейсы или классы.

Определение типа не является определением класса. Вы можете рассмотреть определение типа как объединение нескольких наборов данных, где результирующий набор - ваш тип T.

4

Обозначение T extends Employee в объявлении параметра типа относится либо расширение класса или реализация интерфейса.

public class Company<T implements Employee> не является допустимым синтаксисом.

Поэтому public class Company<T extends Employee> означает, что общий тип типа T вашего класса Company должен реализовать интерфейс Employee.

Смежные вопросы