-1

在 Java 中,想象一下这些接口和类:

public interface Iface<S, T> { ... }

public class Parent<A, B> implements Iface<B, A> { ... }

public class Sub extends Parent<String, Integer> { ... }

有没有办法让一个函数接受Iface并获得它的泛型类型。例如,如果您输入一个Sub.class

public void showTypes(Class<Iface<S, T>> ifaceClass) {
    // do something...
}

//showTypes(Sub.class) --> S = Integer.class, T = String.class

编辑:关于类型擦除。如果你有一个ArrayList<?>你不知道它是哪个泛型类型。但这种情况不同。如果我有一个扩展的类,ArrayList<String>我可以知道它的泛型类型(String.class)。请看这个片段:

@SuppressWarnings("serial")
public class StringList extends ArrayList<String> {
    public static void main(String... args) {
        ParameterizedType superType = 
            (ParameterizedType) StringList.class.getGenericSuperclass();
        Type[] types = superType.getActualTypeArguments();
        Class<?> clss = (Class<?>) types[0];
        System.out.println(clss);
    }
}
4

3 回答 3

2

好吧,我找到了我要找的东西。TypeTools是一个只有一个类的小型库,专门为此而设计。遗憾的是它不在 Maven 中央存储库中。

TypeResolver.resolveArguments(Sub.class, Iface.class) --> [java.lang.Integer, java.lang.String]

Spring 在GenericTypeResolver中有类似的方法:

GenericTypeResolver.resolveTypeArguments(Sub.class, Iface.class);
于 2013-01-22T12:46:56.587 回答
0

不,由于泛型在 Java 中的实现方式,这无法完成。在运行时,没有关于用于泛型参数的实际类型的信息。

您可以在此处阅读有关类型擦除的更多详细信息

于 2013-01-22T10:11:23.740 回答
-1
Update 01.23:

我们和其他响应者回答了一个松散的具体问题,所以我们不值得 -1 票......不太公平......

Original answer:

不,没有办法……

在泛型主要规范中,当您使用 T 和 S 时,它将生成以下代码:

public void showTypes(Class<Iface<Object, Object>> ifaceClass) {
    // do something...
}

所以你不会知道这些信息...

您可以有一个解决方案来定义这样的泛型类型的类:

public void showTypes(T type)
{
if (s instanceof Number) 
 System.out.println("Number")
if (s instanceof String) 
 System.out.println("String")
}

但正如我所见,这不是你的选择......

它只会在运行时确定,而不是编译时......

于 2013-01-22T10:13:25.800 回答