gpt4 book ai didi

java - 获取应用了类型参数的已实现接口(interface)的 Type 实例

转载 作者:行者123 更新时间:2023-11-30 04:00:51 24 4
gpt4 key购买 nike

给定一个 Type 实例(可能是 Class 或 ParameterizedType),我需要获取该类实现的接口(interface)的特定 Type。如果没有泛型,这很容易,在 Class 实例上调用 getInterfaces() 就完成了。但是,即使实现的接口(interface)有自己的类型参数(可能依赖也可能不依赖于原始类本身的类型参数),我也需要它工作。

一些示例,当给定一个类时,函数应返回 Iterable

class Foo implements Iterable<Integer> {}

但还必须返回 Iterable 给定的类

class Bar<T> implements Iterable<T> {}

和代表 Bar 的 ParmeterizedType

有没有一种简单的方法可以通过内置反射、第三方工具等来做到这一点?

需要澄清的是,这不仅需要适用于通过文字检索的类型实例(Foo.class 等),还需要适用于通过反射返回的那些可以包含应用类型参数的实例,例如通过方法反射返回的返回类型

static Bar<String> magic() { ... }

这将是引用原始 Bar 类和 String 类型参数的 ParameterizedType。

最佳答案

您可能应该看看 Google Guava TypeToken 类:http://code.google.com/p/guava-libraries/wiki/ReflectionExplained

它提供了复杂的机制来解析各种上下文中的类型。 如果我正确理解了您的问题,那么像 TypeToken#resolveType(Type) 方法可能接近您正在寻找的内容:

import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Iterator;

import com.google.common.reflect.TypeToken;

class Foo implements Iterable<Integer> {

@Override
public Iterator<Integer> iterator()
{
return null;
}
}

class Bar<T> implements Iterable<T> {

@Override
public Iterator<T> iterator()
{
return null;
}
}

public class TypeParameterTest
{
public static void main(String[] args) throws Exception
{
Type i0 = getInterface(Foo.class, 0);
System.out.println("First interface implemented by Foo: "+i0);

Method method = TypeParameterTest.class.getDeclaredMethod("magic");
Type returnType = method.getGenericReturnType();

System.out.println("Magic method return type: "+returnType);

Type i1 = getInterface(returnType, 0);
System.out.println("First interface implemented by Bar<String>: "+i1);
}

private static Type getInterface(Type type, int interfaceIndex)
{
TypeToken<?> typeToken = TypeToken.of(type);
Class<?> c = typeToken.getRawType();
Type[] interfaces = c.getGenericInterfaces();
if (interfaces.length == 0)
{
return null;
}
Type i = interfaces[interfaceIndex];
return typeToken.resolveType(i).getType();
}

public static Bar<String> magic() { return null; }
}

这里的输出是

First interface implemented by Foo: java.lang.Iterable<java.lang.Integer>
Magic method return type: Bar<java.lang.String>
First interface implemented by Bar<String>: java.lang.Iterable<java.lang.String>

关于java - 获取应用了类型参数的已实现接口(interface)的 Type 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22014129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com