Вот мой код:
Мой модуль содержит:
<generate-with class="com.bilancio.ReflectionGenerator">
<when-type-assignable class="com.bilancio.client.Reflection" />
</generate-with>
public interface Constructable {}
public interface Reflection {
public <T> T instantiate( String className );
}
public class ReflectionGenerator extends Generator
{
@Override
public String generate( TreeLogger logger, GeneratorContext
context, String typeName ) throws UnableToCompleteException
{
TypeOracle oracle = context.getTypeOracle( );
JClassType markerInterface =
oracle.findType( Constructable.class.getName( ) );
List<JClassType> clazzes = new ArrayList<JClassType>( );
PropertyOracle propertyOracle = context.getPropertyOracle( );
for ( JClassType classType : oracle.getTypes( ) )
{
if ( !classType.equals( markerInterface ) &&
classType.isAssignableTo( markerInterface ) )
clazzes.add( classType );
}
final String genPackageName = "com.bilancio.client";
final String genClassName = "ReflectionImpl";
ClassSourceFileComposerFactory composer = new
ClassSourceFileComposerFactory( genPackageName, genClassName );
composer.addImplementedInterface( Reflection.class.getCanonicalName( ) );
composer.addImport( "com.bilancio.client.*" );
PrintWriter printWriter = context.tryCreate( logger,
genPackageName, genClassName );
if ( printWriter != null )
{
SourceWriter sourceWriter =
composer.createSourceWriter( context, printWriter );
sourceWriter.println( "ReflectionImpl( ) {" );
sourceWriter.println( "}" );
printFactoryMethod( clazzes, sourceWriter );
sourceWriter.commit( logger );
}
return composer.getCreatedClassName( );
}
private void printFactoryMethod( List<JClassType> clazzes,
SourceWriter sourceWriter )
{
sourceWriter.println( );
sourceWriter.println( "public <T> T instantiate( String
className ) {" );
for ( JClassType classType : clazzes )
{
if ( classType.isAbstract( ) )
continue;
sourceWriter.println( );
sourceWriter.indent( );
sourceWriter.println( "if( className.equals(\"" +
classType.getName( ) + "\")) {" );
sourceWriter.indent( );
sourceWriter.println( "return new " +
classType.getQualifiedSourceName( ) + "();" );
sourceWriter.outdent( );
sourceWriter.println( "}" );
sourceWriter.outdent( );
sourceWriter.println( );
}
sourceWriter.println( );
sourceWriter.outdent( );
sourceWriter.println( "}" );
sourceWriter.outdent( );
sourceWriter.println( );
}
}
Я хочу использовать это так:
GWT.create (Reflection.class)). Instantiate ("MyPanel")
Класс MyPanel, очевидно, реализует интерфейс Construable.
Я продолжаю получать:
Несоответствие типов: невозможно преобразовать из MyPanel в T
Что вы думаете?
изм:
Я изменил эту строку, пытаясь выполнить непроверенное приведение, но все равно ошибка:
sourceWriter.println( "return (T) new " + classType.getQualifiedSourceName( ) + "();");
А вот и мой след:
[DEBUG] [main] - Rebinding com.bilancio.client.Reflection
[DEBUG] [main] - Adding '1' new generated units
[DEBUG] [main] - Validating newly compiled units
[ERROR] [main] - Errors in 'generated://670356D9DA0D417BB8171499B4C4D57B/com/bilancio/client/ReflectionImpl.java'
[ERROR] [main] - Line 9: This method must return a result of type T
[INFO] [main] - See snapshot: /tmp/com.bilancio.client.ReflectionImpl6488844579312624283.java