首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类的泛型类型参数可以从其构造函数的参数中推断出来吗?

类的泛型类型参数可以从其构造函数的参数中推断出来吗?
EN

Stack Overflow用户
提问于 2012-12-15 01:18:39
回答 3查看 102关注 0票数 2

这是我想要做的:

我有一个接口服务,如下所示:

代码语言:javascript
复制
public interface Service<A extends Object, R extends Object> {
    R run(A a);
}

现在,我想链接两个这样的服务,同时保持它的通用性:

代码语言:javascript
复制
public class Link<A, R> implements Service<A, R> {

    private Service<A, X> s1; // fail
    private Service<X, R> s2; // fail

    public <X> Link(Service<A, X> s1, Service<X, R> s2) {
        this.s1 = s1;
        this.s2 = s2;
    }

    @Override
    public R run(A a) {
        return s2.run(s1.run(a));
    }
}

我想解决的问题是给Link类分配一个泛型类型X,但我希望通过它的构造函数而不是通过类声明来推断它。

它是如何实现的?

编辑:

我解决这个问题的方法是一个实用的静态方法,它执行链接过程:

代码语言:javascript
复制
public static <A, I, R> Service<A, R> link(final Service<A, I> s1, final Service<I, R> s2) {
    return new Service<A, R>() {
        @Override
        public R run(A a) throws Exception {
            I intermediate = s1.run(a);
            return s2.run(intermediate);
        }
    };
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-15 01:19:27

泛型类型X不能作为类的一部分(不是为每次方法调用重新选择)而不是其声明的一部分。

当然,您可以隐藏不安全的强制转换并确保您的程序能够正常工作,但由于Java类型系统的限制,这实际上是您唯一的两个选择。

不过,我要做的不是提供Link构造函数,而是提供静态工厂方法

代码语言:javascript
复制
public static <A, X, R> Service<A, R> link(Service<A, X> s1, Service<X, R> s2) {
  return new Link<A, X, R>(s1, s2);
}

...ensuring表示X是自动推断的,永远不会转义。

票数 4
EN

Stack Overflow用户

发布于 2012-12-15 04:06:17

为了获得更好的协方差,你可以像这样调整上面的答案:

代码语言:javascript
复制
public class Link <F, X, T>  implements Service <F, T> {
    private final Service<F, ? extends X> from;
    private final Service <X, ? extends T> to;

    public Link(Service <F, ? extends X> from, Service <X, ? extends T> to) {
        this.from = from;
        this.to = to;
    }

    @Override
    public T run (F input) {
        return to.run (from.run (input));
    }
}
票数 1
EN

Stack Overflow用户

发布于 2012-12-15 01:39:36

这将会起作用:

代码语言:javascript
复制
public class Link<A, R, X> implements Service<A, R> {

    private Service<A, X> s1; 
    private Service<X, R> s2; 

    public Link(Service<A, X> s1, Service<X, R> s2) {
        this.s1 = s1;
        this.s2 = s2;
    }

    @Override
    public R run(A a) {
       return s2.run(s1.run(a));
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13883372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档