将泛型返回类型转换为接口类型

时间:2013-10-16 17:08:58

标签: java generics

我正在尝试为通用Wrapper创建一个工厂方法,我遇到的问题是我需要传递所需的返回类型(wrapTyped() - 方法),或者我必须显式地将输入参数转换为所需的返回类型(wrapAuto() - 方法,第一次使用)。但我懒惰并且不想写额外的演员:)

有没有办法表达wrapAuto()的声明,以便案例“wantThis”(在最底层)有效?

public class GenericFactory {

static class Wrapper<T> {
    T wrappdObject;
    boolean flag;
    String name;

    public Wrapper(T wrappedObject, boolean flag, String name) {
        this.wrappdObject = wrappedObject;
        this.flag = flag;
        this.name = name;
    }

    public T getObject() {
        return wrappdObject;
    }

    // some more irrelevant methods
}

static interface InterfaceType {
}

static class ImplementationA implements InterfaceType {
}

static <U> Wrapper<U> wrapTyped(Class<U> type, U wrappedObject, boolean flag, String name) { 
    return new Wrapper<U>(wrappedObject, flag, name);
}

static <U> Wrapper<U> wrapAuto(U wrappedObject, boolean flag, String name) {
    return new Wrapper<U>(wrappedObject, flag, "NoName");
}

// compiles, but is cumbersome
public Wrapper<InterfaceType> cumbersome = wrapTyped(InterfaceType.class, new ImplementationA(), true, "A");

// compiles, but is also cumbersome
public Wrapper<InterfaceType> alsoUgly = wrapAuto((InterfaceType) new ImplementationA(), true, "B");

// Want this, but "Type mismatch error"
public Wrapper<InterfaceType> wantThis = wrapAuto(new ImplementationA(), false, "C");

}

我把它剥了一下,为简单起见,我只声明了一组接口和具体实现。我练习类Wrapper可以用于许多完全不同的,不相关的类型。

2 个答案:

答案 0 :(得分:3)

在方法wrapAuto中,添加另一个类型参数,其中U作为上限,并将其用作形式参数类型:

static <U, T extends U> Wrapper<U> wrapAuto(T wrappedObject, boolean flag, String name) {
    return new Wrapper<U>(wrappedObject, flag, "NoName");
}

然后这会起作用:

Wrapper<InterfaceType> wantThis = wrapAuto(new ImplementationA(), false, "C");

通过此调用,T被推断为ImplementationAU被推断为InterfaceType。边界T extends U完全匹配这些类型。


<强>参考文献:

答案 1 :(得分:0)

您编写的方法没有任何问题。但推论并不完美。您始终可以显式指定类型参数:

public Wrapper<InterfaceType> wantThis = GenericFactory.<InterfaceType>wrapAuto(new ImplementationA(), false, "C");