Является ли Шаблон производного объекта подклассом шаблона базового типа

Если «яблоко» является подклассом "фрукта"; , затемList<apple> это подклассList<fruit> это правильно ?

Ответы на вопрос(5)

List<Apple> не является подклассомList<Fruit>. Они оба типаList.

Вот код Java, демонстрирующий этот факт.

import java.util.LinkedList;
import java.util.List;

class Fruit { }

class Apple extends Fruit { }

public class Main {

    public static void main(String[] args) {
        Fruit fruit = new Fruit();
        Apple apple = new Apple();
        List<Fruit> fruitList = new LinkedList<Fruit>();
        List<Apple> appleList = new LinkedList<Apple>();

        System.out.println(fruit.getClass().getSuperclass());
        System.out.println(apple.getClass().getSuperclass());
        System.out.println(fruitList.getClass().getSuperclass());
        System.out.println(appleList.getClass().getSuperclass());
    }

}

Выход

class java.lang.Object
class Fruit
class java.util.AbstractSequentialList
class java.util.AbstractSequentialList
 Nader Shirazie29 июн. 2009 г., 07:52
Это верно только для Java, который не имеет надлежащей поддержки для дженериков (использует стирание типа). Это не относится к языкам .NET, например.

е @ нет, по крайней мере, на обычном языке программирования.a подклассb не означает, что любая вариацияa также является подклассом того же вариантаb.

IList<something> вIList<object>, но ты не можешь сделать это в C # 3.0

Решение Вопроса

List<apple> а такжеList<fruit> не связаны. Оба этих класса могут иметь совершенно разные реализации, и нет способа конвертировать один в другой. Например,List<> шаблон может быть каким-то образом специализирован дляapple с совершенно другой структурой, чем у общегоList<T> шаблон.

И даже если бы реализации были совместимы, все равно было бы плохой идеей рассматриватьList<apple> какList<fruit> с тех пор люди начали бы добавлять в этот список все виды фруктов, в которых должны были быть яблоки. Смотрите также это вход в C ++ FAQ Lite, это говорит о яблоках и бананах ...

Mutable Контейнеры просто так не работают - на самом деле, это захватывающий аспект ООП.

ВList<fruit> Вы можете вставить банан - вList<apple>, ты не можешь; таким образом, нарушается принцип Лискова, который доказывает, что у вас нет подклассов.

Неизменны контейнеры действительно работают, как и ожидалось (ковариация - это термин искусства).

Достаточно смешно, я никогда не видел этот захватывающий закон в печати (сродни тому факту, что в мире Изменяемые объекты, которые нельзя назвать квадратным прямоугольником IS-A ... но в миренеизменны объекты, тыможе!) - Я только придумал это сам по опыту и наблюдению. Я хотел бы, чтобы научный справочник использовался в этом контексте, если кто-нибудь может это проверить, кстати; -)

 Nader Shirazie29 июн. 2009 г., 07:53
+ 1 для обозначения "ковариации" в качестве технического термина ...
 Nader Shirazie29 июн. 2009 г., 07:56
в зависимости от контекста, ковариация и контравариантность будут разрешены в .NET 4.0 Msdn.microsoft.com / EN-US / библиотека / dd465120 (VS.100) .aspx)

Ваш ответ на вопрос