Java 强制使用多个相同类型的参数参数的静态方法
我需要一个通用的静态方法来接受相同类型(类)的对象,以进行反射性比较。(编译时检查) 例如,如果第一个参数是字符串;第二个也是字符串 我想下面会有用的;但是没有。我可以将任意两个不同的对象传递给以下对象:(Java 强制使用多个相同类型的参数参数的静态方法,java,generics,Java,Generics,我需要一个通用的静态方法来接受相同类型(类)的对象,以进行反射性比较。(编译时检查) 例如,如果第一个参数是字符串;第二个也是字符串 我想下面会有用的;但是没有。我可以将任意两个不同的对象传递给以下对象:( publicstaticvoidcompareandsetnoneditablefields(T current,T old){ 即使下面的也不起作用。请帮助 public static <T> void compareAndSetNonEditableFields(Class
publicstaticvoidcompareandsetnoneditablefields(T current,T old){
即使下面的也不起作用。请帮助
public static <T> void compareAndSetNonEditableFields(Class<T> type, T current, T old){}
publicstaticvoidcompareandsetnoneditablefields(类类型,T current,T old){}
更新_1
团队感谢您的帮助,但是下面给出的解决方案
ClassName.
是可选的,如果我使用它,只有我会知道我设置了一些错误;但是大多数开发人员不知道这种用法(我现在也是新学的;谢谢);他们可以直接调用这个静态API:(
更新_2
即使我使用非静态方式,我也不能阻止使用子类而不是超级类。 如下所示。没有编译问题。我也不知道它是否有效。考虑到这一点,相对而言,我现在将遵循@Ingo答案
public class HandlingNonEditableFields<T> {
public void compareAndSetNonEditableFields(T currentObject, T oldObject) {
}
public static void main(String[] args) {
SuperClass obj1 = new SuperClass();
SubClass obj2 = new SubClass();
new HandlingNonEditableFields<SuperClass>().
compareAndSetNonEditableFields(obj1, obj2);
}
}
public类HandlingNonEditableFields{
public void compareAndSetNonEditableFields(T currentObject,T oldObject){
}
公共静态void main(字符串[]args){
超类obj1=新的超类();
子类obj2=新的子类();
新HandlingNonEditableFields()。
CompareAndSetNoneEdit字段(obj1、obj2);
}
}
更新_3
非静态方法方式: 我试图通过添加
Class
作为我的一个论点来强制它,但即使这样也不起作用
public void compareAndSetNonEditableFields(Class<T> type2ForceT, T currentObject, T oldObject) { }
public void compareAndSetNonEditableFields(类type2ForceT、T currentObject、T oldObject){}
它抛出异常以使用
类您需要以下方式调用您的方法:
ClassName.<String>compareAndSetNonEditableFields("test", "test2"); // ok
ClassName.<String>compareAndSetNonEditableFields("test", 12); // compile time error
ClassName.compareAndSetNoneEdit字段(“test”、“test2”);//确定
ClassName.compareAndSetNonEditableFields(“test”,12);//编译时错误
您是否尝试过:
static <X, Y extends X> boolean method(X a, Y b)
静态布尔方法(xa,yb)
我可以将任意两个不同的对象传递给以下对象:(
是的,您应该能够。它工作正常。T
可以是Object
,任何引用类型都是Object
的子类型。这两个参数实际上是同一类型的实例--Object
。您应该将其作为
public static void compareAndSetNonEditableFields(Object current, Object old){}
基本上,您想要的对泛型没有任何意义。泛型不是用于进行任意限制;泛型是用于类型安全。它允许我们提供类型之间的关系,以便我们可以证明它们支持特定操作,而无需显式强制转换。类型t
没有边界,这意味着您可以除了Object
提供给所有引用类型的方法或字段之外,不能依赖它来拥有任何特定的方法或字段。这意味着您在该方法中没有做任何关心对象类型的事情(至少是以类型安全的方式)。因此,该方法应该能够毫无问题地接受任何参数。否;我不知道在运行时将获得哪种对象类型我不认为可以使用变量作为类型参数,因此可能无法执行此操作?如果我只知道字符串,我将直接使用它;为什么它需要泛型?是的,但不幸的是,我没有hink你想要的是可能的。@EdgarBoda Hi,你对ingo答案满意吗?@KanagaveluSugumar注意到,第二个参数仍然可能是第一个参数类型的子类型。因此它不是完全相同的“类型”。但至少它捕获了liek字符串和整数。无论给出什么参数,选择X=Object
和Y=Object
都是一个有效的选择,可以对其进行编译。仅仅因为编译器没有推断,并不意味着它解决了问题。“即使下面的参数也不起作用。”它怎么不起作用?
public static void compareAndSetNonEditableFields(Object current, Object old){}