我希望能够在这里与Java仿制药专家联系。我们假设你有一些打字类:
public interface SomeClass<T> {
void doSomething(final T t);
}
在给定T
实例的情况下,还有一个函数可以为您提供SomeClass<T>
的实例:
public static class Retriever {
public <T> T get(final SomeClass<T> c) {
return null; // actual implementation left out
}
}
现在让我们说你有一个SomeClass<?>
和一个检索器的集合:
final List<SomeClass<?>> myClasses = null; // actual implementation left out
final Retriever myRetriever = null; // actual implementation left out
我们无法执行以下操作:
for (final SomeClass<?> myClass : myClasses) {
myClass.doSomething(myRetriever.get(myClass));
}
现在我的问题:Java是否需要支持才能在本地定义类型?类似的东西:
<T> for (final SomeClass<T> myClass : myClasses) {
myClass.doSomething(myRetriever.get(myClass));
}
此处,类型T
的范围限定为for循环。我们正在定义T
以摆脱通配符?
。就是这样。 T
的引入应该使我们能够编写如上所述的所需for循环。
FWIW,以下代码是一种解决方法。我们正在引入一项功能,仅用于将?
转换为T
。
for (final SomeClass<?> myClass : myClasses) {
workAround(myRetriever, myClass);
}
public static <T> void workAround(final Retriever myRetriever, final SomeClass<T> myClass) {
myClass.doSomething(myRetriever.get(myClass));
}
本地定义的用户类型可能是更优雅的解决方案吗?
答案 0 :(得分:3)
现在我的问题是:Java是否需要支持才能在本地定义类型?
没有。类型参数的最小范围是方法,即为了使for循环可以使用类型T
,您必须将封闭方法定义为泛型或封闭类。例如:
<T> void method(List<SomeClass<T> myClasses) {
for (final SomeClass<T> myClass : myClasses) {
myClass.doSomething(myRetriever.get(myClass));
}
}