Какво означава нотацията 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 обект, който препраща към самата дефиниция на клас, интерфейс или enum и към който можете да правите запитвания към неговите метаданни, използвайки отражение. В Java 1.5+ обектите Class използват генерични данни, за да укажат точния тип на обекта на класа, например Class<BasicFileAttributes>. - person Platinum Azure; 15.10.2012
comment
Ето, ти сам го каза: предаваш обект, а не клас. - person Marko Topolnik; 15.10.2012
comment
Това е обект, представляващ клас. Сега ще ми кажеш ли, че не ми е позволено да кажа, че искам да използвам низ, или файл, или int? Трябва ли да кажа обект, представляващ низ, обект от класа File или част от примитивни данни, които са от тип int? Не бъди такъв предписвач. Използвам същата граматика, която почти всеки друг използва. Използвах по-прецизен език, за да разясня нещата по ваша мълчалива молба; сега просто се държиш като педантичен глупак. Просто млъкни, идиот. - person Platinum Azure; 15.10.2012
comment
Както казах съвсем ясно: не бъркайте начинаещите с такива разговорни изрази. OP е поставил този въпрос точно защото е объркан относно това разграничение. Може би просто ви липсва умствената сила да забележите тези фини (за вас) улики в текста на въпроса. Ако това е така, предполагам, че можете да бъдете извинен, но моят съвет беше в полза на OP, не за ваша. Като странична бележка, разграничението между клас и обект, представляващ клас, изобщо не е свързано с граматиката. И в двата случая използвате абсолютно същата граматика: тази на английския език. - 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 файлове, които също описват техните метаданни. Суфиксът тук или използването на класов файл не означава непременно, че типът, за който се говори, е "клас", тъй като в него не е интерфейс или enum.

person matt b    schedule 15.10.2012