Java泛型 - Java是否需要支持本地定义的类型?

时间:2015-10-29 18:34:15

标签: java generics

我希望能够在这里与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));
}

本地定义的用户类型可能是更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:3)

  

现在我的问题是:Java是否需要支持才能在本地定义类型?

没有。类型参数的最小范围是方法,即为了使for循环可以使用类型T,您必须将封闭方法定义为泛型或封闭类。例如:

<T> void method(List<SomeClass<T> myClasses) {
    for (final SomeClass<T> myClass : myClasses) {
        myClass.doSomething(myRetriever.get(myClass));
    }
}