Подстановочные знаки не имеют большого смысла при объявлении локальных переменных, однако они действительно важны при объявлении параметра для метода.
Представьте, что у вас есть метод:
int countLegs ( List< ? extends Animal > animals )
{
int retVal = 0;
for ( Animal cur : animals )
{
retVal += cur.countLegs( );
}
return retVal;
}
С помощью этой подписи вы можете сделать это:
List<Dog> dogs = ...;
countLegs( dogs );
List<Cat> cats = ...;
countLegs( cats );
List<Animal> zoo = ...;
countLegs( zoo );
Если, однако, вы объявите countLegs
следующим образом:
int countLegs ( List< Animal > animals )
Тогда в предыдущем примере скомпилировалось бы только countLegs( zoo )
, потому что только этот вызов имеет правильный тип.
Лол .. почему я не подумал об этом раньше?
Просто используйте библиотеку Intel MKL Math в Java и .NET!
См. Следующие ссылки:
Я могу помочь с C #:
Здесь это еще один вопрос SO, в котором обсуждаются различные математические библиотеки C #
И вы можете взглянуть на PLINQ для справки по многопоточности C #.
ALGLIB - это кроссплатформенная библиотека численного анализа и обработки данных. Она бесплатна - ALGLIB распространяется по лицензии GPL (версия 2 или более поздняя). Она содержит:
Дифференциальные уравнения
Линейные уравнения
Матричные и векторные операции, собственные значения и собственные векторы
Численное интегрирование, интерполяция и подгонка, оптимизация
БПФ, свертка, корреляция
Статистика: общие алгоритмы, проверка гипотез
Анализ данных: классификация, регрессия, другие задачи
Специальные функции