2015-03-26 3 views
1

Я пытаюсь понять, в чем разница между использованием Generics и Object. Я уже прочитал несколько ответов, связанных с Java (см. https://stackoverflow.com/a/5207175/1349754), и я обнаружил, что разница весьма заметна - функция/метод возвращает (a) объект, если мы используем Object как тип входных аргументов и (b) фактический тип, если мы используем общий T Однако у Дарта есть свое поведение, и в этом случае он неприменим. Давайте посмотрим пример:Dart. Какая разница между использованием общего Т и объекта?

main() { 
    // expect Object type 
    print((new TestObject()).Pass('string').runtimeType); 
    // expect String type 
    print((new TestGeneric()).Pass('string').runtimeType); 
    // both output String type 
} 

class TestObject { 
    Object Pass(Object element) 
    => element; 
} 

class TestGeneric<T> { 
    T Pass(T element) 
    => element; 
} 

У меня нет хороших знаний об использовании объектно-ориентированной идеологии. Поэтому, пожалуйста, может ли кто-нибудь объяснить, в чем отличие использования дженериков вместо базового класса Object.

ответ

1

Дженерики позволяют избежать многих заявлений, когда только типы меняются между несколькими классами. В вашем примере класс TestObject можно удалить и заменить на TestGeneric<Object> везде TestObject.

Неверный ожидаемый выход для (new TestObject()).Pass('string').runtimeType. runtimeType возвращает тип объекта. Здесь возвращается 'string', и поэтому 'string'.runtimeType - String.

Чтобы узнать тип возвращаемого метода, вы должны использовать mirrors во время выполнения или analyzer во время сборки.

+0

Пожалуйста, не могли бы вы привести пример кода, в котором, по-видимому, выгода или дженерики. Я все еще не вижу разницы. –

+1

Например, если вы определяете 'a = new TestGeneric ()' вы получите предупреждение _ Тип аргумента 'int' не может быть присвоен типу параметра 'String'_, если вы вызов 'a.Pass (1);' –

+0

Хм, это имеет смысл! Я начинаю понимать) –

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