Java不允许调用泛型类型的递归方法?
让我们创建两个扩展Java不允许调用泛型类型的递归方法?,java,generics,types,Java,Generics,Types,让我们创建两个扩展BasedEntity的类,并将它们称为EBE1和EBE2 现在,您可以使用EBE1作为类型参数创建ResourceAssembly对象。但是假设在toResource方法的实现中,您执行类似return-toResource(new EBE2())的操作 因此toResource()的返回类型变为Resource,但这是错误的,因为根据结构,您应该返回Resource。这就是编译时错误的原因。Java的类型安全本能开始发挥作用 如果您想为toResource方法返回泛型,那么
BasedEntity
的类,并将它们称为EBE1
和EBE2
现在,您可以使用
EBE1
作为类型参数创建ResourceAssembly
对象。但是假设在toResource
方法的实现中,您执行类似return-toResource(new EBE2())的操作代码>
因此toResource()
的返回类型变为Resource
,但这是错误的,因为根据结构,您应该返回Resource
。这就是编译时错误的原因。Java的类型安全本能开始发挥作用
如果您想为toResource
方法返回泛型,那么您必须将实体
对象按原样传递,或者将其更改为您正在初始化的具体类型,而不使用泛型(虽然我不知道为什么会有人使用第二个选项,但这是使其“编译”的“解决方案”).
另外,在外面,当你申报的时候。您没有为ResourceAssembly
指定类型参数,因此它是原始参数。尝试使用类型参数执行此操作。你也会有红色的曲线
以下是一个例子:
Error:(28, 25) java: incompatible types: spring.BasedEntity cannot be converted to T
静态类资源{
}
静态类基身份{
}
静态类ExtendsBasedEntity1扩展了BasedEntity{
}
静态类ExtendsBasedEntity2扩展了BasedEntity{
}
静态公共类ResourceAssembler{
公共资源存储资源(T实体){
返回到源代码(new ExtendsBasedEntity1());//T
可能不是ExtendsBasedEntity
,而是BaseEntity
的某些其他子类型,因此编译错误
“修复”问题的一种方法是使用类型令牌
公共类ResourceAssembler{
私有最终类类型;
公共资源汇编程序(类类型){
this.type=type;
}
公共资源存储资源(T实体){
toResource(type.newInstance());
//其他代码
}
}
假设这对你有用。共享toResource
signature签名就在那里。公共资源toResource(T实体)当从内部调用#toResource
时,不能保证T
将是extendedsbasedentity
。为什么?从内部和外部调用编译器有什么区别?区别在于,当在类内部时,T
未知,除了它将是BasedEntity
的某些子类型真正的代码,它实际上不是新对象,而是从另一个类中获取的。在这种情况下,我该如何解决它?编辑question@Bohemian你能告诉我这种方法可以抛出一个实例化异常的一些方法吗?或者它有可能抛出一个实例化异常吗?@Shankha057newInstance()如果没有默认构造函数,
将抛出一个实例化异常
。@erotsppa你不能“解决”它。除非你有一个类型标记是某种形式,否则你不能知道运行时的实际类型,所以你不能使用任意子类。我需要它在方法内部工作,以便能够调用自己。你知道怎么做吗?谢谢
//some other class
new ResourceAssembler<ExtendsBasedEntity>().toResource(new ExtendsBasedEntity())
Error:(28, 25) java: incompatible types: spring.BasedEntity cannot be converted to T
static class Resource<T> {
}
static class BasedEntity {
}
static class ExtendsBasedEntity1 extends BasedEntity {
}
static class ExtendsBasedEntity2 extends BasedEntity {
}
static public class ResourceAssembler<T extends BasedEntity> {
public Resource<T> toResource(T entity) {
return toResource(new ExtendsBasedEntity1()); //<----compile error
}
}
public static void main(String[] args) {
new ResourceAssembler<ExtendsBasedEntity1>().toResource(new ExtendsBasedEntity1()); // <---- No errors or warnings. This is valid and legal
new ResourceAssembler<ExtendsBasedEntity2>().toResource(new ExtendsBasedEntity1()); // <----- red squiggly lines here
new ResourceAssembler().toResource(new ExtendsBasedEntity2()); // <--compiler warning about raw types but no error
}
public class ResourceAssembler<T extends BasedEntity> {
private final Class<T> type;
public ResourceAssembler(Class<T> type) {
this.type = type;
}
public Resource<T> toResource(T entity) {
toResource(type.newInstance());
//some other code
}
}