Если Вы захотите портативное решение, которое будет работать над любым ANSI SQL-92 RDBMS, необходимо будет добавить новый столбец к таблице.
Joe Celko является исходным автором Вложенные Наборы подход к хранению иерархий в SQL. Вы можете, Google "вложил наборы" иерархия для понимания больше о фоне.
Или можно просто переименовать порожденный к leftid и добавить , исправился .
Вот моя попытка суммировать Вложенные Наборы, которые горестно потерпят неудачу, потому что я не Joe Celko: SQL является основанным на наборе языком, и модель смежности (хранящий родительский идентификатор) НЕ является основанным на наборе представлением иерархии. Поэтому нет никакого чистого основанного на наборе метода для запросов схемы смежности.
Однако , большинство основных платформ представило расширения в последние годы для контакта с этой точной проблемой. Таким образом, если кто-то отвечает с Определенным для пост-ГРЭС решением, используйте это любой ценой.
Да, это возможно (но не с вашей подписью метода), и да, с вашей подписью типы должны быть одинаковыми.
С предоставленной вами подписью T
должен быть связан с одним типом (например, String
или Integer
) на месте вызова. Однако вы можете объявить сигнатуры методов, которые принимают несколько параметров типа
public <S, T> void func(Set<S> s, Set<T> t)
. Обратите внимание, что в приведенной выше сигнатуре я объявил типы S
и T
в самой сигнатуре. Следовательно, они отличаются от любых универсальных типов, связанных с классом или интерфейсом, содержащим функцию, и не зависят от них.
public class MyClass<S, T> {
public void foo(Set<S> s, Set<T> t); //same type params as on class
public <U, V> void bar(Set<U> s, Set<V> t); //type params independent of class
}
Возможно, вы захотите взглянуть на некоторые сигнатуры методов классов коллекций в пакете java.util
. Обобщения - действительно довольно сложная тема, особенно когда рассматриваются подстановочные знаки (? Extends
и ? Super
). Например, часто бывает так, что метод, который может принимать в качестве параметра Set
, также должен принимать Set
. В этом случае вы увидите такую подпись:
public void baz(Set<? extends T> s);
По SO уже есть много вопросов, на которые вы можете ответить!
a and b must both be sets of the same type. But nothing prevents you from writing
myfunction(Set<X> a, Set<Y> b)
Вы можете объявить несколько переменных типа для типа или метода. Например, использование параметров типа в методе:
<P, Q> int f(Set<P>, Set<Q>) {
return 0;
}
Вам не нужно иметь дело с исключениями. Предварительным условием для метода является то, что вызывающие абоненты должны использовать перечисление, а не приводить к нему волей-неволей int. Это было бы безумием. Разве не суть перечислений , а не для использования целых чисел?
Любому разработчику, который привел бы 17 к перечислению Color, на мой взгляд, потребовалось бы 17 ударов сзади.
Вы также можете написатьpublic <X,Y> void myFunction(Set<X> s1, Set<Y> s2){...}