Ковариантность Java

Похоже, что большинство (все?) Ответов здесь полагаются на некоторую форму git filter-branch --subdirectory-filter и тому подобное. Это может работать «чаще всего», однако в некоторых случаях, например, в случае, когда вы переименовали папку, например:

 ABC/
    /move_this_dir # did some work here, then renamed it to

ABC/
    /move_this_dir_renamed

Если вы сделаете обычный стиль фильтра git для извлечения «move_me_renamed», вы потеряете история изменений файла, произошедшая со спины, когда она изначально была move_this_dir ( ref ).

Таким образом, кажется, что единственный способ действительно сохранить всю историю изменений (если у вас такой случай), это, по сути, скопировать репозиторий (создать новый репозиторий, установить его в быть источником), затем уничтожить все остальное и переименовать подкаталог в родительский файл следующим образом:

  1. Клонировать многомодульный проект локально
  2. Ветви - проверьте, что там: git branch -a
  3. Выполните проверку для каждой ветви, которая будет включена в разделение, чтобы получить локальную копию на вашей рабочей станции: git checkout --track origin/branchABC
  4. Сделайте копию в новом каталоге: cp -r oldmultimod simple
  5. Перейдите в новую копию проекта: cd simple
  6. Избавьтесь от других модулей, которые не нужны в этом проекте:
  7. git rm otherModule1 other2 other3
  8. Сейчас остается только подкаталог целевого модуля
  9. Избавьтесь от подкаталога модуля, чтобы корень модуля стал новым корнем проекта
  10. git mv moduleSubdir1/* .
  11. Удалите подкаталог реликвии: rmdir moduleSubdir1
  12. Проверять изменения в любой момент: git status
  13. Создать новое git-репо и скопируйте его URL, чтобы указать этот проект в него:
  14. git remote set-url origin http://mygithost:8080/git/our-splitted-module-repo
  15. Убедитесь, что это хорошо: git remote -v
  16. Передайте изменения в удаленное хранилище: git push
  17. Перейдите к удаленному репо и проверьте, что все это есть
  18. Повторите это для любой другой необходимой ветви: git checkout branch2

Это следует github doc "Разделение подпапки в новом хранилище" шаги 6-11, чтобы подтолкнуть модуль к новому репо.

Это не сэкономит вам места в папке .git, но сохранит всю историю изменений этих файлов даже при переименовании. И это может не стоить того, если не будет потеряно «много» истории и т. Д. Но, по крайней мере, вы гарантированно не потеряете старые коммиты!

7
задан Cody Gray 24 January 2012 в 03:43
поделиться

2 ответа

Поскольку getMammals может вернуть List , и если он был преобразован в List , то вы Мог бы добавить к нему Зебру . Вам нельзя разрешить добавить Зебру в список Жираф , не так ли?

class Zebra extends Mammal { }

List<Giraffe> giraffes = new List<Giraffe>();

List<Mammal> mammals = giraffes; // not allowed

mammals.add(new Zebra()); // would add a Zebra to a list of Giraffes
19
ответ дан 6 December 2019 в 07:07
поделиться

К сожалению, это не так.

Когда вы объявляете getMammals () для возврата List это означает, что он может возвращать List или List , но не List

Ваш main () должен выглядеть вот так:

public static void main(String[] args) {
    List<? extends Mammal> mammals = getMammals();
    Mammal mammal = mammals.get(0);
}

РЕДАКТИРОВАТЬ: Что касается ковариации, то это обычно подразумевается под этим:

class Animal {
    public Animal getAnimal() {return this;}
}

class Mammal extends Animal {
    public Mammal getAnimal() {return this;}
}

class Giraffe extends Mammal {
    public Giraffe getAnimal() {return this;}
}

Как вы можете видеть, это позволяет перегрузить методы возвращаемого типа при переопределении метода.

6
ответ дан 6 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: