我想在Java中做这样的事情:
public static <T> T foo() {
return (T) bar(T);
}
public static Object bar(Class<?> klaz) {
return klaz.newInstance();
}
Run Code Online (Sandbox Code Playgroud)
但是代码没有编译,因为我不能用T代替Class <?>.
有了一个具体的类,我可以打电话吧,如:
bar(ConcreteClass.class);
Run Code Online (Sandbox Code Playgroud)
但同样对T不起作用.即没有T.class这样的东西
在C#中,typeof适用于具体和模板类型.所以,对bar的调用将是:
bar(typeof(T));
Run Code Online (Sandbox Code Playgroud)
但是我无法在Java中找到类似的东西.
我错过了什么,或者Java没有办法获取模板参数的类型?如果Java没有设施,是否有任何解决方法?
namespace GenericsTest
{
public class AGenericClass<T>
{
public class NestedNonGenericClass
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,应该NestedNonGenericClass算是一个泛型类?
反射API说它是一个泛型类,甚至把包含类的模板参数作为嵌套类的模板参数.
Type nestedClass = typeof(AGenericClass<int>.NestedNonGenericClass);
Console.Out.WriteLine("IsGeneric: {0}\tHasGenericArguments: {1}",
nestedClass.IsGenericType, nestedClass.GetGenericArguments().Length > 0);
Run Code Online (Sandbox Code Playgroud)
打印出:
IsGeneric:True HasGenericArguments:True
我不完全同意这种行为.即使编译器为其生成泛型类型NestedNonGenericClass,我也想知道它是否是通用的,因为它是声明的,或者因为它的容器是通用的.
所以,我的问题是:
首先,你认为可以考虑嵌套类泛型,因为它的容器是通用的吗?为什么/为什么不呢?
其次,您是否碰巧知道其他一些API可以帮助我只识别声明为通用的类?
PS:我在ECMA规范中找不到与此相关的任何内容(或者我可能只是掩盖它).
- 编辑 -
为了添加更多的上下文,我正在开发一种代码生成器.我正在使用反射API来确定类型是否是通用的.
我遇到了一个问题Dictionary<TKey, TValue>.KeyCollection.
因为KeyCollection,反射API说它是通用的并且把我交给我,TKey并且TValue在容器中声明了它们.因此,发电机最终产生Dictionary<TKey, TValue>.KeyCollection<Tkey, TValue>
我能解决这个问题的唯一方法是将嵌套类的模板参数与容器匹配,并消除所有匹配的模板参数.但我想知道是否有更好的方法.
我正在构建一个 Lua 库(实际上是一个内部 kong 插件),这是我第一次使用 Lua - 更不用说用它编写生产代码了。
我已经把它变成了luarock。据我所知,它rockspec允许我指定其他库作为依赖项。但似乎不存在开发依赖性的概念。例如,我的测试、模拟等所需的库......我宁愿不让它们成为实际依赖项列表的一部分。
我已经将我的开发依赖项保留在依赖项列表中,但在 git 推送之前将它们注释掉。在生产 Lua 项目中通常如何解决这个问题?管理这些依赖关系的推荐方法是什么?