2015-11-20 73 views
0

首先看起来并不像这样,这可能是可能的,所以最好听一些设计模式或解决方法来完成此工作。基于接口的类对象中的类文字

我需要提供一个类文字为Class<T>的外部库,以便它能够从dynamodb中找到正确的类型和注释。这是签名

public <T> T load(java.lang.Class<T> clazz, java.lang.Object hashKey) 

但是在我的应用程序中,所需的类类型是动态的,并且从接口动态解析。

这里是一个例子,我从接口动态地解析类的全名。

String dynamoDBTypeName = getDynamoDBClassName(someInterface); 
Class<?> clazz = Class.forName(dynamoDBTypeName); 

,然后我需要转换clazz中类文字,因此它可以被传递给

mapper.load(SomeClazz.class, hashKey) 

我无法找到如何类对象转换为类字面这样我就可以解决将实际类型传递给lib。有这样的吗?还是有更动态的解决类接口的类文字的优雅解决方案?

+0

我不知道你的意思是将类对象转换为类文字。类的文字就像'String.class'。如果通过执行'Class.forName'获得该对象,那么将其转换为文字意味着什么? –

+0

按类对象我的意思是类和类文字是一个类 Sergey

+1

哦,我明白了。在这种情况下,如果没有不受控制的演员,你无法做到这一点。 '类 clazz =(Class )Class.forName(...)'。 –

回答

1

如果我正确地解释你的意图,那么你可以这样做:

String dynamoDBTypeName = getDynamoDBClassName(someInterface); 
Class<?> clazz = Class.forName(dynamoDBTypeName); 
Object loaded = mapper.load(clazz, hashKey); 

无论你从Someclass.class或的Class.forName(...)的类,它是同一类目的。类型参数的值只在编译时定义,所以传递给mapper.load的信息,实现mapper.load的代码或返回的值绝对没有区别。

唯一的区别是,如果将Class<X>传递给mapper.load(),那么编译器知道它会返回一个X,并且可以将它分配给X类型的变量而不用转换。如果你传递Class<?>,编译器只知道它会返回一个Object。它可以通过一些知道该类型应该是什么类型的代码投射到类的一个实例上。

+0

不幸的是,我不能改变返回类型的mapper.load是外部SDK的一部分。所以这个签名必须遵循'public T load(java.lang.Class clazz,java.lang.Object hashKey)' – Sergey

+0

我没有改变返回类型。当您通过类时,返回类型是?。编译器知道它的Object的一个子类,所以你可以将它分配给Object没有问题。 –

+0

您对Java泛型的思考方式有些问题,但我无法完全理解它。请记住像T这样的类型参数不会改变任何有关实际运行的代码。他们只是帮助编译器检查你的工作。 –