我正在编写一个程序,该程序将使用Java反射(即Class.forName()
)根据用户的输入动态创建类实例。一个要求是我的程序创建的实例必须扩展一个我定义的特定类(称为)SomeClass
。我的问题是:对于存储此类类型,我应该使用有界的泛型Class<? extends SomeClass>
还是无界的泛型Class
?我发现一些Java书籍说Class是使用无界通配符泛型的良好实践之一,但是我想知道这是否适用于我程序中的情况。
如果您发现我的问题不够清楚或需要某些信息,请随时告诉我。
您应该使用,Class<? extends SomeClass>
因为这就是泛型的用途。
在调用时Class.forName
,检查它是否SomeClass.class.isAssignableFrom
为新类。否则,您应该抛出一个IllegalArgumentException
或ClassCastException
。
编辑:
或者,调用asSubclass(SomeClass.class)
将为您执行此操作。
例如:
public SomeClass instantiate(String name)
throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> raw = Class.forName(name);
//throws ClassCastException if wrong
Class<? extends SomeClass> generic = raw.asSubclass(SomeClass.class);
// do what you want with `generic`
return generic.newInstance();
}
如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或
我有一个关于Java仿制药的问题。假设我有以下方法: 我如何用通配符<解释上面的类型转换?扩展U>?使用它与只使用有什么区别?
问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符
如果在Java中创建泛型类(该类具有泛型类型参数),是否可以使用泛型方法(该方法采用泛型类型参数)? 考虑下面的例子: 正如您所期望的那样,对于任何对象,的实例,我都可以调用: 但是,如果我试图使用的实例而不指定泛型类型,那么调用将返回一个
问题内容: 我正在为apache HttpClient包实现一个,如下所示: 但我希望函数不返回任何值,即。这可能吗?由于不是有效的Java类型,因此以下内容无法编译: 我想可以替换为以返回对象,但这并不是我真正想要的。 问 :是否有可能安排在这样一种方式,我可以返回此回调局面从? 问题答案: 泛型仅处理对象类。泛型不支持void和基本类型,您不能将它们用作参数化类型。您必须改用Void。 你能说
问题内容: 我有一个方法以a 作为参数。 在中,我如何知道a 是还是a 是? 问题答案: 根据用户omain的回答“如果使用<?>,则意味着您将不会在任何地方使用参数化类型。要么转到特定类型(在您的情况下,似乎是),要么转到非常通用的“ 另外,我相信如果您使用问号,编译器将在运行时(类型;有效Java的第119页)消除类型不匹配的情况,绕过擦除,并有效地消除了使用泛型类型所带来的好处? 要回答发问