Java 如何获取子类的泛型类型

Java 如何获取子类的泛型类型,java,generics,Java,Generics,在Java中,想象一下这些接口和类: public interface Iface<S, T> { ... } public class Parent<A, B> implements Iface<B, A> { ... } public class Sub extends Parent<String, Integer> { ... } 编辑:关于类型擦除。如果您有一个ArrayList,则无法知道它是哪种泛型类型。但情况不同。如果我有一个扩

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

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

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

public class Sub extends Parent<String, Integer> { ... }
编辑:关于类型擦除。如果您有一个
ArrayList
,则无法知道它是哪种泛型类型。但情况不同。如果我有一个扩展了
ArrayList
的类,我可以知道它的泛型类型(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);
    }
}
@SuppressWarnings(“串行”)
公共类StringList扩展了ArrayList{
公共静态void main(字符串…参数){
ParameterizedType超类型=
(ParameterizedType)StringList.class.getGenericSuperclass();
Type[]types=superType.getActualTypeArguments();
类clss=(类)类型[0];
系统输出打印LN(clss);
}
}

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

你可以阅读更多关于

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

Original answer:
不,没有办法

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

public void showTypes(Class<Iface<Object, Object>> ifaceClass) {
    // do something...
}
但在你的情况下,这不是一个选择,因为我看到


它将只在运行时确定,而不是在编译时确定…

好吧,我找到了我要找的东西。是一个只有一个类的小型库,专门设计用于实现这一点。遗憾的是,它不在Maven中央存储库中

TypeResolver.resolveArguments(Sub.class, Iface.class) --> [java.lang.Integer, java.lang.String]
Spring在以下方面有类似的方法:


您找不到用于声明的类型(例如,
newarraylist
),但始终可以使用
getClass
方法来查找实际的类。我不确定OP申请表是什么。@SJuan76:我在申请第二个选项。请查看我的编辑。@GangnamStyleOverflower:可能吧,但我需要更多帮助:)因为您不喜欢接受看似的答案或与响应者沟通,例如ITT或此处:是的,但我总是为每个解决方案回答:)当我检查您的一些问题时,您的状态不是。。。这个线程也是如此。在你的任何回答或问题中,我都不遵守你要求的框架。总的来说:我认为你应该在这个问题上更具沟通性/反诉性和明确性。。。无论如何,和平。Gl找到了你想要的。我因为沟通而提升了它(我显然不赞成它,因为缺少它)。作者:@czupe:无论如何,和平;)老兄,你太棒了。。。真恶心。。。我们解决了你的问题,你否决了我们的答案?:)认真地说,wtf?:)有很多关于这个的话题,没有黑客你就做不到,因为泛型擦除。。无论如何,这是一次很好的研究。但还是不要认为你编辑了你松散的具体问题,我们得到了否决票。。。真恶心。。说真的,我不明白你…@czupe:嘿,我保证我没有否决任何答案!正如我在编辑中所说,这里没有类型擦除。有一个复杂的方式来实现我想要的,但我不认为它是一个黑客。好的,我向你道歉。(我的坏(经验……):从你那里得到一个下注是合乎逻辑的(但不公平),因为你得到了一个更好的解决方案。你也是发问者,祝你过得愉快!Cu!不管怎么说,这个工具从源头上看,也使用反射,但在高层次上:)
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")
}
TypeResolver.resolveArguments(Sub.class, Iface.class) --> [java.lang.Integer, java.lang.String]
GenericTypeResolver.resolveTypeArguments(Sub.class, Iface.class);