Параметризация Generi c Тип с приватным членом - PullRequest
2 голосов
/ 10 марта 2020

При создании класса с обобщенным типом c представляется невозможным использовать закрытый класс в качестве параметра типа, даже если этот класс является внутренним классом обобщенного типа c. Рассмотрим следующий код:

import java.util.Iterator;
import test.Test.Type;

public class Test implements Iterable<Type> {

    @Override
    public Iterator<Type> iterator() {return null;}

    static class Type {}

}

Приведенный выше пример компилируется, тогда как этот же пример не компилируется, когда Type является приватным:

import java.util.Iterator;
// ERROR: The type test.Test.Type is not visible
import test.Test.Type;

// ERROR: Type cannot be resolved to a type
public class Test implements Iterable<Type> {

    @Override
    // ERROR: The return type is incompatible with Iterable<Type>.iterator()
    public Iterator<Type> iterator() {return null;}

    private static class Type {}

}

Почему это невозможно использовать закрытый класс в качестве аргумента типа для включающего его класса? Несмотря на то, что, по моему мнению, класс Type должен быть виден внутри класса Test.

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Это связано с тем, что ни один код вне вашего Test класса не может получить доступ к Type.

Если вы ограничите метод, возвращающий Iterator частной видимостью, он скомпилирует:

import java.util.Iterator;

public class Test {

    public void doTest() {
        Iterator<Type> it = iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }

    private Iterator<Type> iterator() {
        return null;
    }

    private static class Type {}
}
1 голос
/ 10 марта 2020

Могу предположить, что это связано с тем, что если вы сделаете Type приватным, вы не сможете получить результат iterator (), так как Type вне поля зрения. Я могу ошибаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...