Если вы хотите использовать служебный метод, который преобразует общий тип Vector в соответствующий ArrayList, вы можете использовать следующее:
public static <T> ArrayList<T> toList(Vector<T> source) {
return new ArrayList<T>(source);
}
В своем коде вы будете использовать вспомогательный метод следующим образом:
public void myCode() {
List<String> items = toList(someVector);
System.out.println("items => " + items);
}
Вы также можете использовать встроенный java.util.Collections.list (перечисление) следующим образом:
public void myMethod() {
Vector<String> stringVector = new Vector<String>();
List<String> theList = Collections.list(stringVector.elements());
System.out.println("theList => " + theList);
}
Но, как кто-то упоминал ниже, Vector is-a List! Так зачем вам это делать? Возможно, вы не хотите, чтобы какой-то код, который вы используете, знал, что он работает с вектором - возможно, он неуместно преуменьшает значение, и вы хотите устранить этот запах кода. Затем вы можете использовать
// the method i give my Vector to can't cast it to Vector
methodThatUsesList( Collections.unmodifiableList(theVector) );
, если список должен быть изменен. Изменяемая оболочка без манжеты:
public static <T> List<T> asList(final List<T> vector) {
return new AbstractList<T>() {
public E get(int index) { return vector.get(index); }
public int size() { return vector.size(); }
public E set(int index, E element) { return vector.set(index, element); }
public void add(int index, E element) { vector.add(index, element); }
public E remove(int index) { return vector.remove(index); }
}
}
Две стороны равенства в соединении рассматриваются как два отдельных лямбда-выражения, которые генерируют ключи для двух последовательностей.
from category in categories
join prod in products on category.ID equals prod.CategoryID
categories.Join(products,
category => category.ID,
prod => prod.CategoryID,
(category, prod) => new { Category = category, Product=prod });
Использование ключевого слова equals делает однозначным, где заканчивается одна лямбда и начинается другая. С другой стороны, для предложения where существует одно лямбда-выражение, которое определяет соответствие каждого элемента:
from prod in products
where prod.CategoryID == 1
products.Where( prod => prod.CategoryID == 1 )
Теоретически объединения можно было бы реализовать с помощью одного лямбда-выражения as
from category in categories
join prod in products on category.ID == prod.CategoryID
categories.Join(products,
(category, prod) => category.ID == prod.CategoryID,
(category, prod) => new { Category = category, Product=prod });
Однако, вычислив два ключа и выполнив Само сравнение LINQ может использовать хэш-таблицы для более эффективного вычисления соединения, чем если бы ему приходилось выполнять произвольное сравнение для каждой пары элементов.
Вы должны спросить дизайнеров, но ясно, что разрешение любого (логического) выражения допускает слишком много возможностей. Использование специального ключевого слова, такого как равно
, значительно упрощает его привязку к спецификации в виде двух столбцов.
Я нашел обсуждение The Moth .