Что означает обозначение BasicFileAttributes.class в java7?

Вот код

Path file = ...;
BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class);
System.out.println("creationTime: " + attr.creationTime());
System.out.println("lastAccessTime: " + attr.lastAccessTime());
System.out.println("lastModifiedTime: " + attr.lastModifiedTime());


По ссылке http://docs.oracle.com/javase/tutorial/essential/io/fileAttr.html они говорят, что BasicFileAttributes — это класс. Но ссылка http://docs.oracle.com/javase/7/docs/api/java/nio/file/attribute/BasicFileAttributes.html называет его интерфейсом. (Пожалуйста, проясните эту путаницу, если вы знаете, хотя это не основная проблема)

Основная проблема:
Я не понимаю параметр BasicFileAttributes.class. Они пытаются передать класс в качестве параметра?


person Maneet Singh    schedule 15.10.2012    source источник


Ответы (3)


BasicFileAttributes — это интерфейс, но в разговорном выражении обычно используется такая фраза, как «класс BasicFileAttributes», означающая «класс, который реализует BasicFileAttributes».

Что касается вашего основного вопроса, вы передаете экземпляр специального класса Java java.lang.Class. Так что нет, вы не «передаете класс» (эта концепция на самом деле бессмысленна в Java). Вы передаете такой экземпляр java.lang.Class, который описывает интерфейс BasicFileAttributes.

Это похоже на передачу экземпляра File методу: вы передаете не фактический файл, а объект, через который можно управлять этим файлом.

person Marko Topolnik    schedule 15.10.2012
comment
Хорошо, я поискал и обнаружил, что экземпляр и объект — это одно и то же. Таким образом, ваши слова Вы передаете такой экземпляр java.lang.Class, который описывает интерфейс BasicFileAttributes, означают, что параметр BasicFileAttributes.class передает объект. Надеюсь, я прав, говоря это. - person Maneet Singh; 16.10.2012
comment
Да, точно. Объект является экземпляром своего класса. - person Marko Topolnik; 16.10.2012
comment
Спасибо за ваше время и помощь. :-) - person Maneet Singh; 16.10.2012

BasicFileAttributes определяется как интерфейс, потому что он определяет поведение (в данном случае методы доступа к информации об атрибутах файла), и существуют подклассы, которые обеспечивают это способом, определяемым реализацией. На странице документации перечислены DosFileAttributes и PosixFileAttributes как известные подклассы.

Интерфейс может использоваться как объявленный тип, чтобы сохранить основной контракт поведения неизменным. Другими словами, когда у меня есть объект BasicFileAttributes, я не знаю, действительно ли он DosFileAttributes или PosixFileAttributes под капотом, и мне все равно. Меня волнует только то, что я могу вызвать любой из BasicFileAttributes методов и получить ожидаемые результаты.

Что касается Files.readAttributes, да, вы передаете класс. В этом случае вы можете либо получить основные атрибуты файла, используя BasicFileAttributes.class, или вы можете передать один из его подклассов и получить специфичную для платформы информацию (рискуя иметь дело с UnsupportedOperationException, если вы запрашиваете атрибуты, которых нет на вашей платформе).

person Platinum Azure    schedule 15.10.2012
comment
Вы не можете передать класс. Я не думаю, что это нормально - сбивать с толку новичка такими заявлениями. - person Marko Topolnik; 15.10.2012
comment
Да, ты можешь. Точнее, вы передаете объект Class, который ссылается на само определение класса, интерфейса или перечисления и для которого вы можете запрашивать его метаданные с помощью отражения. В Java 1.5+ объекты Class используют дженерики для указания точного типа объекта класса, например Class<BasicFileAttributes>. - person Platinum Azure; 15.10.2012
comment
Вот вы сами сказали: вы передаете объект, а не класс. - person Marko Topolnik; 15.10.2012
comment
Это объект, представляющий класс. Теперь вы собираетесь сказать мне, что мне не разрешено говорить, что я хочу использовать строку, или файл, или целое число? Должен ли я называть объект, представляющий строку, объект класса File или часть примитивных данных типа int? Не будь таким предписателем. Я использую ту же грамматику, что и почти все остальные. Я использовал более точный язык, чтобы устранить неоднозначность по вашей подразумеваемой просьбе; теперь ты просто педантичный придурок. Просто заткнись, идиот. - person Platinum Azure; 15.10.2012
comment
Как я уже сказал совершенно ясно: не путайте новичков такими разговорными выражениями. ОП задал этот вопрос именно потому, что он не понимает этого различия. Возможно, вам просто не хватает умственных способностей, чтобы заметить эти тонкие (для вас) подсказки в тексте вопроса. Если это так, я полагаю, вас можно извинить, но мой совет был для ОП, а не для вас. Кстати, различие между классом и объектом, представляющим класс, вовсе не связано с грамматикой. В обоих случаях вы используете одну и ту же грамматику: английскую. - person Marko Topolnik; 15.10.2012
comment
Еще один момент: BasicFileAttributes.class не является объектом, представляющим класс. Здесь каждый может точно увидеть, в какую скользкую местность заводит вас ваше разговорное слово. Это не способ объяснить эти понятия новичку. - person Marko Topolnik; 15.10.2012
comment
На самом деле грамматика другая: грамматика, которую использую я и многие другие, по сравнению с грамматикой, которую вы хотите, чтобы я использовал. Если хотите, можете предположить, что я имею в виду предпочтение грамматического подмножества. Дополнительную информацию см. на странице en.wikipedia.org/wiki/. - person Platinum Azure; 16.10.2012
comment
Уффф... до меня только начинает доходить вся безбрежность твоего непонимания. Тогда позвольте мне выразить это более простыми словами. Класс — существительное; объект, представляющий класс, представляет собой именное словосочетание, в котором используется причастный оборот прилагательного, модифицированный его объектом. Оба они соответствуют стандартной английской грамматике. Является ли эта грамматика описательной или предписывающей, я предоставляю вам подумать. - person Marko Topolnik; 16.10.2012
comment
@MarkoTopolnik и PlatinumAzure: Это обсуждение приводит меня к выводу, что BasicFileAttributes.class передает объект (на языке непрофессионала). Я прав? - person Maneet Singh; 16.10.2012
comment
@ManeetSingh Я сделал все возможное, чтобы объяснить это в своем ответе. Возможно, прочитайте его и оставьте там комментарий на случай, если потребуются дополнительные разъяснения. - person Marko Topolnik; 16.10.2012

Они пытаются передать класс в качестве параметра?

Да.

Интерфейсы имеют связанные .class файлы, которые также описывают их метаданные. Суффикс здесь или использование файла класса не обязательно означает, что упоминаемый тип является «классом», поскольку он не является интерфейсом или перечислением.

person matt b    schedule 15.10.2012