2012-03-01 21 views
1

我有n个java类,每个包含自己的一组变量。 我有一种方法,必须接受这些n类之一作为基于某些条件的参数。 如何将所有这些类作为子类创建为泛型类型,以便我的方法签名接受所有这些不同的类型?我不想重载该方法。如果使用类型'Object'作为参数,我正在失去我传递的输入参数类的性质。如何将所有类放在一个通用类类型下?

回答

2

这是你想要的吗?

public interface common<T extends common<?>> { 
    public void commonMethod(T param, ...); 
} 

public class child implements common<child> { 
    public void commonMethod(child param, ...) { 
     ... 
    } 
} 
+0

这看起来很有希望。我会试试这个 – user811433 2012-03-01 17:11:47

3

定义所有类实现的接口。然后在方法头部声明你的参数作为该接口的类型。

+0

我试过这种方法。但是我必须明确地在方法内部强制类型转换以恢复其行为。 – user811433 2012-03-01 08:51:56

+0

不,如果接口定义了您需要的所有方法,则不需要转换。同样所有的类都应该有共同的东西(因此界面),否则你的设计可能是错误的,或者你应该考虑超载。 – m0skit0 2012-03-01 08:57:23

+1

那你想要什么?你在寻找“如何编写一个接受泛型类型的方法,而不需要转换它就可以接受所有子类的所有方法?” : - ? – 2012-03-01 09:03:19

1

如何将所有这些类作为子类变为泛型,以便我的方法签名接受所有这些不同类型?

简单地做一个抽象类,MySuperClass,这个类被所有你想传递给方法的类继承。这个超类有共同的功能和属性。

另一种方式,如果你的子类可能会扩展其他类;或者,班上没有什么共同之处(除了事实上他们都传递给你的方法),你可以有一个接口,说MySuperClass(理想情况下,我喜欢从我开始接口,如IMySuperClass)。

我不想重载该方法。

一旦您拥有了超级课程或接口,您的方法签名看起来就像myMethod(Param1 val1, MySuperClass myObj, Param3 val3)

简单。

+0

与实现接口相同。我不得不在方法中明确地键入cast。 – user811433 2012-03-01 08:54:02

+0

如果没有共同的功能,我建议重载该方法。如果有共同的功能,那么抽象事物并传递给相同的方法是有道理的。 – Nishant 2012-03-01 08:57:47

1

如果你不能使用多态(由其他人的建议),那么你可以使用Java泛型做到这一点:

例如这可以用来将任何对象放入缓存中:

public <T> void doSomethingWithObject(final T object) { 
    ... 
} 

你可以这样称呼它:使用字符串

yourInstance.<String> doSomethingWithObject(object); 
相关问题