LINUX.ORG.RU

История изменений

Исправление 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++.