Когда вы не используете обобщенный компилятор, он обрабатывает его как необработанный тип, и, следовательно, каждый универсальный тип становится Object
, и поэтому вы не можете передать String[]
, так как ему нужно Object[]
. deal - если вы используете
List l = new ArrayList<String>();
Вы используете raw type, и все его элементы экземпляра заменяются его аналогами стирания. В частности каждый параметризованный тип, появляющийся в объявлении метода экземпляра, заменяется его необработанным аналогом. Подробнее см. JLS 4.8.
Я не верю, что функция импорта поддерживается по умолчанию в Какао. Когда пользователь нажимает кнопку «Открыть» на открытой панели, платформа вызывает openDocumentWithContentsOfURL: display: error:
на NSDocumentController
. Здесь система документов определяет, какой тип файла вы открываете, и консультируется с файлом Info.plist, чтобы выяснить, какой подкласс NSDocument
использовать для открытия документа.
Вы можете создать подкласс NSDocumentController
и переопределите openDocumentWithContentsOfURL: display: error:
метод для перехвата типов файлов, которые следует импортировать, а не открывать. В подклассе NSDocument
напишите новый инициализатор с именем вроде initWithImportedContentsOfURL: type: error:
(или что-нибудь с лучшим именем :-)), чтобы создать новый документ без названия и прочитать в содержимом импортированного файла.
Алекс, спасибо за ваш ответ, но я нашел способ, который мне нравится немного больше:
- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName
error:(NSError **)outError
{
*outError = nil;
if ([typeName isEqualToString:@"SomeReadOnlyType"])
{
// .. (load data here)
[self setFileURL:nil];
return result;
}
else
{
// .. (do whatever you do for other documents here)
}
}
Таким образом, все еще можно использовать систему документов, предоставляемую Какао, вместо того, чтобы использовать мою собственную .
Я также задокументировал решение здесь: http://www.cocoadev.com/index.pl?CFBundleTypeRole немного ниже по странице.