2014-11-02 6 views
-1

Несоответствие типа: не может конвертировать из BytecodeCodeProcessor<new AbstractBytecodeCodeVisitor(){}> в BytecodeCodeProcessor<AbstractBytecodeCodeVisitor>Java - анонимный экземпляр абстрактного класса

public abstract class AbstractBytecodeCodeVisitor { 
} 
public class BytecodeCodeProcessor 
    <T extends AbstractBytecodeCodeVisitor> { 

    public BytecodeCodeProcessor(ClassSourceResult classSourceResult, 
    T visitor) { 

    } 
} 
BytecodeCodeProcessor<AbstractBytecodeCodeVisitor> processor = 
     new BytecodeCodeProcessor<>(classSourceResult, 
new AbstractBytecodeCodeVisitor() { 

}); 
+0

Вы должны рассмотреть [The Java Учебники. Дженерики] (http://docs.oracle.com/javase/tutorial/java/generics/). Вы не можете создавать новые экземпляры в общем определении. –

+1

http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicitly-p –

+0

@LuiggiMendoza: я не вижу, где ошибка. Что значит «вы не можете создавать новые экземпляры в общем определении»? – Krab

ответ

0

Анонимный класс экземпляра через new AbstractBytecodeCodeVisitor() {} подкласс AbstractBytecodeCodeVisitor. Этот анонимный подкласс равен , а не, равный параметру общего типа, указанному BytecodeCodeProcessor<AbstractBytecodeCodeVisitor>. Anonymous AbstractBytecodeCodeVisitor! = AbstractBytecodeCodeVisitor, таким образом, ошибка компиляции. Код может быть исправлен различными способами, некоторые из которых перечислены в следующей ссылке.

Generics and anonymous classes (bug or feature?)

Одно из решений:

BytecodeCodeProcessor<AbstractBytecodeCodeVisitor> processor = 
    new BytecodeCodeProcessor<AbstractBytecodeCodeVisitor>(
     classSourceResult, new AbstractBytecodeCodeVisitor() {} 
    ); 
+0

Это не ByteecodeCodeProcessor, анонимный. –

+0

Тем не менее, заполнение алмаза решает ошибку компиляции. – jaco0646

+0

По другой причине, чем та, которую вы воспитывали. С аргументом типа ни один тип не должен быть выведен, потому что вы явно объявляете его. Без этого он выводится на тип, который делает выражение не назначаемым 'BytecodeCodeProcessor ', в Java 7. Улучшенный тип вывода на Java 8 устранил эту проблему. –