Все! Я уже несколько часов ломаю голову над этим. Извините, если это что-то настолько тривиальное, но, полагаю, я недостаточно хорошо разбираюсь в дженериках 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 выдает эту ошибку?
Спасибо!




Ваш 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
Спасибо @sfat! это исправило! :-)
Рад, что смог помочь. Удачного кодирования и хороших выходных! :)
удалить
<E>изnewMethod?private void newMethod(Class<E> klass) { interface2 = new Int2Impl<>(); interface2.interfaceimpl(klass); }