Дошли руки до дженериков

4,167
68
693
Есть, значит, такой метод
Java:
protected <T extends EntityAnimalMist> void closePanic(EntityPlayer sourse, long time) {
    List<T> list = this.world.<T>getEntitiesWithinAABB(this.getClass(), this.getEntityBoundingBox().grow(16.0D, 3.0D, 16.0D));
    for (T entity : list) {
        if (entity.getEntitySenses().canSee(sourse)) entity.setRevengeTime(time);
    }
}

Но getEntitiesWithinAABB выдаёт ошибку capture#2-of ? extends ...
Код:
The parameterized method <T>getEntitiesWithinAABB(Class<? extends T>, AxisAlignedBB) of type World is not applicable for the arguments (Class<capture#2-of ? extends EntityAnimalMist>, AxisAlignedBB)

Напоминаю, что сам метод следующий
Java:
public <T extends Entity> List<T> getEntitiesWithinAABB(Class <? extends T > classEntity, AxisAlignedBB bb) {
    return this.<T>getEntitiesWithinAABB(classEntity, bb, EntitySelectors.NOT_SPECTATING);
}

Как енто исправить?
 
Последнее редактирование:
копэс ты Programist<T>
 
ХМ лично я понял, что ты вызываешь метод
<T>getEntitiesWithinAABB(Class<? extends T>, AxisAlignedBB)
но твой метод определяется как
(Class<capture#2-of ? extends EntityAnimalMist>, AxisAlignedBB)
 
Как это решать я ума не приложу, надо подумать
 
Что это за херня?)))
Стандартная херня, как и в ваниле...

В общем, понял, что нужно делать так
Java:
protected <T extends EntityAnimalMist> void closePanic(Class <? extends T> clazz, EntityPlayer sourse, long time) {
    List<T> list = this.world.<T>getEntitiesWithinAABB(clazz, this.getEntityBoundingBox().grow(16.0D, 3.0D, 16.0D));
    ...
}

Но вот хотелось бы, чтобы переменная clazz, бралась из самого класса по типу this.getClass() или как-то так...
Это реально вообще?
 
Хотя, по ходу, это не верно, потому что такая конструкция выдаёт ошибку О_о
Java:
protected <T extends EntityAnimalMist> void closePanic(Class <? extends EntityAnimalMist> clazz, EntityPlayer sourse, long time) {
    List<T> list = this.world.<T>getEntitiesWithinAABB(clazz, this.getEntityBoundingBox().grow(16.0D, 3.0D, 16.0D));
    ...
}
 
Хотя, по ходу, это не верно, потому что такая конструкция выдаёт ошибку О_о
Java:
protected <T extends EntityAnimalMist> void closePanic(Class <? extends EntityAnimalMist> clazz, EntityPlayer sourse, long time) {
    List<T> list = this.world.<T>getEntitiesWithinAABB(clazz, this.getEntityBoundingBox().grow(16.0D, 3.0D, 16.0D));
    ...
}
Потому что нужно так:
Java:
protected <T extends EntityAnimalMist> void closePanic(Class <T> clazz, EntityPlayer sourse, long time) {
    List<T> list = this.world.getEntitiesWithinAABB(clazz, this.getEntityBoundingBox().grow(16.0D, 3.0D, 16.0D));
    ...
}

Класс нужен, чтобы getEntitiesWithinAABB вернул список энтитей нужного класса.
Но ты уверен, что тебе тут нужен дженерик вообще? Твой метод ничего не возвращает. А вызывать метод для какого-то особого класса EntityAnimalMistAnother скорее всего не нужно будет. Поэтому почему бы не сделать просто вот так:
Java:
protected void closePanicEntityPlayer sourse, long time) {
    List<EntityAnimalMist> list = this.world.getEntitiesWithinAABB(EntityAnimalMist.class, this.getEntityBoundingBox().grow(16.0D, 3.0D, 16.0D));
    ...
}
 
Эм... Ну да, не возвращает, но мне нужен список именно конкретных сущностей, а не всех EntityAnimalMist в радиусе.
В итоге я сделал так:
Java:
protected <T extends EntityAnimalMist> void closePanic(Class <? extends T> clazz, EntityPlayer sourse, long time) {
    List<T> list = this.world.<T>getEntitiesWithinAABB(clazz, this.getEntityBoundingBox().grow(16.0D, 3.0D, 16.0D));
    ...
}
Но вопрос был в том, а нельзя ли брать класс из самого объекта, чтобы не указывать его вручную каждый раз?
 
Нет, нельзя.
И вот это <? extends T> не нужно тоже. У тебя тип полностью описан тут <T extends EntityAnimalMist>
 
Назад
Сверху