2

我正在用java编写一个通用函数,但是,我似乎无法判断是否有任何方法可以设置一个通用对象必须包含的类列表。

像这样的东西:

public static <T in {String.class, Integer.class, Long.class}> Collection<T> test(Collection<T> val);
4

5 回答 5

3

你可以有像这样的有界类型参数,例如:

public static <T extends String & Runnable> Collection<T> test(Collection<T> val);

但是您的示例将不起作用,因为您有多个类并且 Java 不支持多重继承。

此外,您的示例StringInteger因此无论如何它们Longfinal无法扩展。

于 2013-04-23T12:27:01.557 回答
2

不,你不能在 java 中这样做。

你想要的是一个“或”界限。Java 允许“与”边界,例如:

List<T extends Runnable & Comparable<T>>

但不支持类似的“OR”:

List<T extends Integer | String> // doesn't compile

当你考虑它时,它没有任何意义。为每种绑定的类型使用单独的类/方法。

于 2013-04-23T12:39:53.233 回答
1

不幸的是,你不能在 Java 中做你想做的事情——如果它允许你从一个列表中指定一个泛型,你就可以编写一个在 Integers 或 ArrayLists 上操作的函数,这没有任何意义它们不共享通用功能。如果您想将您的方法限制为某些类型,要么找到一个它们都继承自支持您需要的功能的基类/接口(public static <T extends BaseClass> Collection<T> test(Collection<T> val);),要么编写一组重载方法,一个用于您想要支持的每种类型。

于 2013-04-23T12:28:24.900 回答
1

那么你可以同时不能。

在您的具体示例中,这是不可能的。

但是这样的例子会起作用:

 public <T extends CharSequence & Comparable & Closeable> void go(){

对于您的情况,我会选择:

 public <T extends Number & CharSequence> void go() // same rule applies as extend a class and implement as many interfaces as you want
于 2013-04-23T12:29:12.927 回答
0

你不能这样做。泛型仅用于强制类型安全(保证类型可以执行特定方法等)。没有与这种“或”绑定相对应的类型安全要求。类型安全的要求只需要一个“AND”绑定。

于 2013-04-23T19:31:02.060 回答