Проблема Java Generics с использованием параметризованного класса

Все! Я уже несколько часов ломаю голову над этим. Извините, если это что-то настолько тривиальное, но, полагаю, я недостаточно хорошо разбираюсь в дженериках Java. Я начинающий программист на Java.

У меня 2 интерфейса. Int1 и Int2. Int2 расширяет Int1. Int2Impl реализует Int2. Также ниже приведены Lesson1.java и AnotherClass.java. Вопросы следуют после занятий.

Int1.java

     public interface Int1<E> {
           public Lesson1<E> interfaceimpl(Class<E> klass);
     }

Int2.java

     public interface Int2<E> extends Int1<E> {
         String getSomething();
     }

Lesson1.java

    public class Lesson1<E> {

    }

Int2Impl.java

    public class Int2Impl<E> implements Int2<E> {
        Class<E> klass;

        @Override
        public String getSomething() {
          return "nothing";
        }

        @Override
        public Lesson1<E> interfaceimpl(Class<E> klass) {
            this.klass = klass;
            return null;
        }
   }

ДругойClass.java

  public class AnotherClass<E> {
        private Int2<E> interface2; 

        private <E> void newMethod(Class<E> klass) {
            interface2 = new Int2Impl<>();
          **interface2.interfaceimpl(klass);**

      }
   }

Строка кода, вызывающая проблему с компиляцией:

interface2.interfaceimpl (класс); в классе AnotherClass.java

ошибки и быстрые исправления, которые предлагает Eclipse:

Ошибка:

  The method interfaceimpl(java.lang.Class<E>) in the type Int1<E> is not 
  applicable for the arguments (java.lang.Class<E>)

Быстрые исправления:

1) Change method interfaceImpl(Class<E>) to interface(Class<E>) 
2) Cast Argument klass to Class<E> 
3) Change type of klass to Class<E>
4) Create method interfaceImpl(Class<E>) in type 'Int2'

Для меня ни одно из быстрых исправлений не имеет смысла. Кроме того, они также не решают проблему, независимо от того, какой из них я выберу. Может кто-нибудь указать на ошибку и почему Eclipse выдает эту ошибку?

Спасибо!

удалить <E> из newMethod? private void newMethod(Class<E> klass) { interface2 = new Int2Impl<>(); interface2.interfaceimpl(klass); }

Andrei Sfat 24.03.2018 08:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш AnotherClass уже относится к универсальному типу E. Нет необходимости снова определять E на уровне метода.

Просто удалите <E> из вашего newMethod() следующим образом:

public class AnotherClass<E> {
    private Int2<E> interface2;

    private void newMethod(Class<E> klass) {
        interface2 = new Int2Impl<>();
        interface2.interfaceimpl(klass);

    }
}

Хорошо подмечено +1

MadProgrammer 24.03.2018 08:56

Спасибо @sfat! это исправило! :-)

JavaNovice 24.03.2018 08:57

Рад, что смог помочь. Удачного кодирования и хороших выходных! :)

Andrei Sfat 24.03.2018 09:01

Другие вопросы по теме