Problema de conversão - ArrayList

Estou tendo problemas de compilação com o algoritmo do Crivo que realiza a identificação de números primos. Funcionou perfeitamente com array. Porém, ao tentar implementar por meio de ArrayList, me vi diante de alguns erros que até consegui corrigir, mas este persiste apontando algum erro de conversão que não consegui compreender. Poderiam indicar algum tópico ou possível solução que me ajude a entender? Desde já, agradeço.

Código:
`
import java.util.*;

public class CrivoEratostenes {

private int contador = 0;

private ArrayList<Boolean> primos = new ArrayList<Boolean>();

public CrivoEratostenes(int size) {

    for (int i = 0; i < primos.size(); i++) {
        primos.add(true);
    }
    buscaPrimos();
}

public int getContador() {
    return contador;
}

public ArrayList<Boolean> getPrimos() {
    return primos;
}

private void buscaPrimos() {

    for (int i = 2; i < primos.size(); i++) {
        if (primos.get(i)) {
            for (int j = i; i * j < primos.size(); j++) {
                primos.set(i * j, false);
            }
            contador++;
        }
    }
}

public static void main(String[] args) {
    ArrayList<Boolean> arrayFinal = new ArrayList<Boolean>();
    CrivoEratostenes s = new CrivoEratostenes(30);
    arrayFinal.add(s.getPrimos());
    for (int i = 2; i < arrayFinal.size(); i++) {
        if (arrayFinal.get(i)) {
            System.out.printf("%d é primo!", i);

        }
    }
}

}`

Compilation error:

(ArrayList < Boolean>) cannot be converted to Boolean.

Só não compreendi o porquê de apontar conversão para Boolean se o getPrimos, alocado no ArrayFinal, está retornando um ArrayList<Boolean> e não simplesmente um Boolean.

Sua ArrayList é do tipo Boolean, logo o método add pede um Boolean, não ArrayList (que é o que você está passando).
Você pode usar o método addAll, que aceita uma coleção.

E por que está criando uma nova ArrayList? Poderia reutilizar a que o método getPrimos retorna

Sobre o getPrimos, ele retorna todos os valores do ArrayList primos como true. Crei uma nova Lista que copia a anterior e a modifica sem alterar essa primeira.

Utilizei o addAll e funcionou. Mas, até onde testei, só suportou até cerca de 40000 inserções apontando a exceção

ArrayIndexOutBoundsException

Mesmo delimitando que o tamanho máximo do novo ArrayList seria < size isso pode ocorrer? Por quê?

Mostra o erro completo.

Código depois das modificações:
`
import java.util.*;

public class CrivoEratostenes {

private int contador = 0;

private ArrayList<Boolean> primos = new ArrayList<Boolean>();

public CrivoEratostenes(int max) {

    for (int i = 0; i < max; i++) {
        primos.add(true);
    }
    buscaPrimos();
}

public int getContador() {
    return contador;
}

public ArrayList<Boolean> getPrimos() {
    return primos;
}

private void buscaPrimos() {

    for (int i = 2; i < primos.size(); i++) {
        if (primos.get(i)) {
            for (int j = i; i * j < primos.size(); j++) {
                primos.set(i * j, false);
            }
            contador++;
        }
    }
}

public static void main(String[] args) {
    ArrayList<Boolean> arrayFinal = new ArrayList<Boolean>();
    CrivoEratostenes s = new CrivoEratostenes(50000);
    arrayFinal.addAll(s.getPrimos());
    for (int i = 2; i < arrayFinal.size(); i++) {
        if (arrayFinal.get(i)) {
            System.out.printf("%d é primo.\n", i);
        }
    }
    System.out.println(s.getContador());
 }

}`

Erro da compilação: