Java泛型-类型和实现对象的编译时验证

Java泛型-类型和实现对象的编译时验证,java,generics,Java,Generics,我有一个方法可以针对接口类添加实现类的对象,我想将其作为通用方法。 实现类还扩展了类X public abstract class X<T>{...} public interface InterfaceA{...} public class A extends X implements InterfaceA{...} 公共抽象类X{…} 公共接口A{…} 公共类A扩展X实现接口A{…} 现在,我的方法是: public <S, <T extends X<S

我有一个方法可以针对接口类添加实现类的对象,我想将其作为通用方法。 实现类还扩展了类X

public abstract class X<T>{...}

public interface InterfaceA{...}

public class A extends X implements InterfaceA{...}
公共抽象类X{…}
公共接口A{…}
公共类A扩展X实现接口A{…}
现在,我的方法是:

public <S, <T extends X<S>> void add(Class<S> clazz, T object){...}

public我相信您可以通过以下方式删除X上的类型,但仍然会得到add的编译时错误。当然,如果这不符合您的要求,那么多一些上下文将更有帮助

public abstract class X {
}

public class A<T> extends X implements InterfaceA {

      public <S, M extends X> void add(Class<S> clazz, M object){
      }

      public void abc() {
         Class<String> clazz = String.class;
         this.add(clazz, new B());//This should throw compilation error
      }

}

public class B implements InterfaceA {
}
公共抽象类X{
}
公共类A扩展X实现接口A{
公共无效添加(类clazz,M对象){
}
公共图书馆{
Class clazz=String.Class;
this.add(clazz,new B());//这会引发编译错误
}
}
B类公共设施A{
}

如果您不关心
X
的类型参数,只需将其设置为
对象

public class A extends X<Object> implements InterfaceA{...}
公共类A扩展X实现接口A{…}

因此,该方法将适用于任何情况。

假定如果使用类型参数(
X
)声明
X
),则
T
将在
X
中使用。您的问题中没有足够的上下文来理解“have
X
without type parameter”是什么意思,或者为什么需要这样做。“add”方法必须接受接口类作为第一个参数,其实现作为第二个参数。因此,只有“add”方法才能验证类型(在
部分中)。现在,add方法非常有效。唯一的问题是我将膨胀类型T添加到X以使其生效。@JimGarrison我已经用一个案例更新了我的问题。你能帮忙吗?语句
add(I.class,newa())不使用第一种方法。根据Eclipse,它是不明确的。任何一个
add
方法都可以应用。我想要类似于
publicstaticvoidadd(Class

c,T object){}

-当然这是一个wrong@Gurwinder问题是不能指定类型由接口限定。你能不能用不同的方法命名来解决这个歧义?
public class A extends X<Object> implements InterfaceA{...}