繁体   English   中英

Java泛型工厂模式

[英]Java generics factory pattern

使用泛型时我的工厂模式有问题。 我有这个界面,一切都是通用的:

public interface Connection<T> {
    /* methods */
}

显然,我有这个实现:

public class ImplConnection<V> implements Connection<V> {
    /* body */
}

然后我有这个工厂,必须创建一个连接的实例:

public class ConnectionFactory<V, C extends Connection<V>> {
    private final Class<V> contentType;
    private final Class<C> connectionType;

    public ConnectionFactory(Class<V> contentType, Class<C> connectionType) {
        this.contentType = contentType;
        this.connectionType = connectionType;
    }

    public C newConnection() {
        try {
            return connectionType.newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

我正在尝试使用此实例化运行时的连接(我使用Integer作为泛型类型的参数):

connectionFactory = new ConnectionFactory<Integer, Connection<Integer>>(Integer.class, Connection.class);

但它说:

The constructor ConnectionFactory <Integer,Connection<Integer>>(Class<Integer>, Class<Connection>) is undefined.

传递类参数时, Connection不会扩展Connection<Integer> 所以Class<Connection>不能作为Class<? extends Connection<Integer>>参数给出 Class<? extends Connection<Integer>> 这是您的错误背后隐藏的内容。

如果你想保留这种模式,你应该怎么做才有这样的事情:

public class IntegerConnection implements Connection<Integer> {}

这会奏效。

但是,一般来说,您知道可以创建通用实例而无需键入任何特殊内容吗?

public class ConnectionFactory {
  public <T> Connection<T> newConnection() {
    return new ConnectionImpl<T>();
  }
}

你可以像这样使用它:

Connection<Integer> connection = connectionFactory.newInstance();

当我使用泛型时,我经常使用Guava TypeToken 他们非常有帮助。 你的课可能是这样的:

public class ConnectionFactory<V, C extends Connection<V>> {
    private final TypeToken<V> contentType;
    private final TypeToken<C> connectionType;

    public ConnectionFactory() {
        this.contentType = new TypeToken<V>(getClass()) {};
        this.connectionType = new TypeToken<C>(getClass()) {};
    }

    public C newConnection() {
        try {
            return (C) connectionType.getRawType().newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

试一试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM