Мне кажется, что вы на самом деле вообще не используете тип void, это просто используется в примере для обозначения "любой тип может пойти сюда". Чтение «параграфа универсальных типов» в AsyncTask подразумевает, что эти 3 типа должны представлять тип параметра, тип прогресса и тип результата. так, например, если вы создали класс, объявленный как:
public class MyStringTask extends AsyncTask<String, Integer, Long> {
...
}
Тип объекта, который вы передаете в качестве параметра методу execute, будет строкой
var myStringTask = new MyStringTask();
myStringTask.execute("the first string", "the second string");
Ход выполнения будет сообщаться как целочисленное значение, а результирующее значение будет предоставляться как Long.
В C # вы обычно видите это как:
public abstract class AsyncTask<TParam, TProgress, TResult>
с использованием синтаксиса 'T' для параметров типа и реализовано (с использованием приведенного выше примера) как:
public class MyStringTask : AsyncTask<string, int, long>
{
...
}