强制使用多个相同类型的参数参数的静态方法

时间:2013-11-28 10:26:03

标签: java generics

我需要一个通用的静态方法来接受相同类型(类)的对象来反复比较它们。 (编译时间检查)

例如,如果第一个参数是String;第二个也是String。

我认为下面会有效;但没有。我可以将任何两个不同的对象传递到下面:(。

public static <T> void compareAndSetNonEditableFields(T current, T old){}

即便如下也行不通。请帮助。

public static <T> void compareAndSetNonEditableFields(Class<T> type, T current, T old){}

UPDATE_1


团队感谢您的帮助,但下面ClassName.<String>给出的解决方案是可选的,如果我使用它,那么只有我会知道我设置了一些错误;但是大多数开发人员都不知道这种用法(我现在也只是新学到的;谢谢);他们可以直接调用这个静态API :(

UPDATE_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);
    }
 }

UPDATE_3


非静态方法:

我尝试通过添加Class<T>作为我的论点来强制它。但即使这样也行不通。

    public void compareAndSetNonEditableFields(Class<T> type2ForceT, T currentObject, T oldObject) {       }

在方法声明中使用Class<? extends MainTestClass>会抛出异常。否则我必须在方法callee显式转换。

结论


编译时;不可能强制将相同的类级别参数传递给声明为静态和非静态的泛型方法。

3 个答案:

答案 0 :(得分:4)

您需要按以下方式调用您的方法:

ClassName.<String>compareAndSetNonEditableFields("test", "test2"); // ok

ClassName.<String>compareAndSetNonEditableFields("test", 12); // compile time error

答案 1 :(得分:1)

你试过了吗?

static <X, Y extends X> boolean method(X a, Y b)

答案 2 :(得分:0)

  

我可以将任何两个不同的对象传递到下面:(。

那是对的,你应该可以。它工作正常。 T可以是Object,任何引用类型都是Object的子类型。两个参数确实是相同类型的实例 - Object。你应该把它写成

public static void compareAndSetNonEditableFields(Object current, Object old){}

基本上,你想要的东西对于泛型来说没有任何意义。泛型不是用于任意限制;泛型用于类型安全。它允许我们提供类型之间的关系,以便我们可以证明它们支持某个操作而无需显式转换。类型T没有边界,这意味着您不能依赖它来拥有任何特定的方法或字段,除了Object提供给所有引用类型的方法或字段。这意味着您在该方法中没有做任何关心对象类型的事情(至少以类型安全的方式)。因此,该方法应该能够毫无问题地采取任何论证。