class MyProgram
{
int count = 0; // non-static variable / instance variable
public static void main (String[] args) // static method
{
MyProgram c = new MyProgram(); // create c as reference variable
System.out.println(c.count); // call non-static variable using a reference variable name (c)
}
}
Компиляторы думают: «Я не знаю, какой объект является переменной экземпляра, о которой вы говорите».
Java Online
body, html, iframe {
width: 100% ;
height: 100% ;
overflow: hidden ;
}
<iframe src="https://ideone.com/SIDcv1" ></iframe>
Поскольку интерфейсы - это просто классы, за исключением того, что они не имеют атрибутов или реализаций. Единственное использование ключевого слова «реализует» - позволить классу наследовать несколько интерфейсов, но не несколько классов, и мы можем видеть это в коде. Я не знаю, укажут ли они это в будущем, но это не обязательно.
Вероятно, потому что для обеих сторон (B и C) применим только тип, а не реализация. В вашем примере
public class A<B extends C>{}
B также может быть интерфейсом. «extends» используется для определения суб-интерфейсов, а также подклассов.
interface IntfSub extends IntfSuper {}
class ClzSub extends ClzSuper {}
Я обычно думаю о том, что «Sub extends Super» используется как « Sub , как Super , но с дополнительными возможностями 'и' Clz реализует Intf 'как' Clz является реализацией Intf '. В вашем примере это будет соответствовать: B похоже на C , но с дополнительными возможностями. Здесь важны возможности, а не реализация.
Это своего рода произвол, который из условий использования. Это могло быть в любом случае. Возможно, разработчики языка думали о том, что «расширяются» как самый фундаментальный термин, и «реализуют» как особый случай для интерфейсов.
Но я думаю, что implements
будет иметь несколько больше смысла. Я думаю, что это больше связано с тем, что типы параметров не должны находиться в отношении наследования, они могут находиться в любом типе отношения подтипа.
В Java Glossary выражается аналогичный вид .
Ответ здесь находится в : :
Чтобы объявить параметр ограниченного типа, укажите имя параметра типа, за которым следует ключевое слово
blockquote>extends
, а затем его верхняя граница [...]. Обратите внимание, что в этом контексте расширения в общем смысле означают либоextends
(как в классах), либоimplements
(как в интерфейсах).Итак, у вас есть это немного запутанно, и Oracle это знает.
Вот более привлекательный пример того, где разрешены расширения и, возможно, что вы хотите:
public class A<T1 extends Comparable<T1>>
Семантическая разница в общем языке ограничений не существует между тем, реализуется ли класс «реализует» или «расширяет». Возможности ограничения - это «extends» и «super» - то есть, этот класс работает с назначаемым другому (extends), или этот класс можно назначить из этого (super).
class Generic<RenderableT extends Renderable implements Draggable, Droppable, ...> { Generic(RenderableT toDrag) { x = (Draggable)toDrag; } }
. Один хочет проверить время компиляции.
– peterk
5 May 2016 в 03:04
Возможно, базовый тип является общим параметром, поэтому фактический тип может быть интерфейсом класса. Рассмотрим:
class MyGen<T, U extends T> {
Также из интерфейсов клиентского кода перспективы практически неотличимы от классов, тогда как для подтипа важно.