История изменений
Исправление korvin_, (текущая версия) :
у Long и Integer есть оператор плюса. Можно было бы их передать, но у Java стирается тип в генерики, и она не сможет принять такую функцию все равно.
Я тебе ещё раз говорю, что стирание типов тут не при чём. Для произвольного неизвестного типа T не определён оператор (+). В C++ такое работает, потому что шаблоны инстанциируются во время применения, и делают это почти простой текстовой подстановкой, то есть генерируют исходный код, который уже потом компилируется, они не проверяют, что у подставляемого типа есть нужный оператор ДО подстановки. В отличие от Java, Rust, C# и многих других.
В C# нет стирания типов, но это тоже не будет работать:
public static void Main()
{
Console.WriteLine("{0}", Add(1, 2));
}
static <T> T Add(T a, T b) {
return a + b;
}
public static void main (String[] args) throws java.lang.Exception
{
System.out.println(add(1L, 2L));
}
static <T extends Long> Long add(T a, T b) { // <- вот так будет, но только с приведением к Long и потерей типа T на выходе
return a + b;
}
В Хаскелле не будет работать, нужно, чтобы для типа был реализован тайпкласс Num. Нигде (с оговорками) не будет работать, кроме C++.
Исходная версия korvin_, :
у Long и Integer есть оператор плюса. Можно было бы их передать, но у Java стирается тип в генерики, и она не сможет принять такую функцию все равно.
Я тебе ещё раз говорю, что стирание типов тут не при чём. Для произвольного неизвестного типа T не определён оператор (+). В C++ такое работает, потому что шаблоны инстанциируются во время применения, и делают это почти простой текстовой подстановкой, то есть генерируют исходный код, который уже потом компилируется, они не проверяют, что у подставляемого типа есть нужный оператор ДО подстановки. В отличие от Java, Rust, C# и многих других.
В C# нет стирания типов, но это тоже не будет работать:
public static void Main()
{
Console.WriteLine("{0}", Add(1, 2));
}
static <T> T Add(T a, T b) {
return a + b;
}
public static void main (String[] args) throws java.lang.Exception
{
System.out.println(add(1L, 2L));
}
static <T extends Long> Long add(T a, T b) { // <- вот так будет, но только с приведением к Long и потерей типа T на выходе
return a + b;
}
В Хаскелле не будет работать, нужно, чтобы для типа был реализовыван тайпкласс Num. Нигде (с оговорками) не будет работать, кроме C++.