开发者社区> 问答> 正文

使用泛型构造子类的实例

在查看一些Java 8代码时,我看到了一些我不太了解的泛型用法,因此我编写了自己的代码来模拟正在发生的事情:

public class GenericsTest {

public static void main(String[] args) {
    TestBuilder tb = TestBuilder.create(Test_Child::new);
    Product<Test_Child> p = tb.build();

    Test tc = p.Construct("Test");
}

static class TestBuilder<T extends Test> {

    private final Factory<T> f;

    public TestBuilder(Factory<T> f) {
        this.f = f;
    }

    public static <T extends Test> TestBuilder<T> create(Factory<T> f){
        return new TestBuilder<>(f);
    }

    public Product<T> build(){
        return new Product<>(f);
    }

}

static class Test {
    public Test(){
    }
}

static class Test_Child extends Test{
    public Test_Child(String s){
        System.out.println("Test_Child constructed with string '"+s+"'");
    }
}

interface Factory<T extends Test> {
    T create(String s);
}


static class Product<T extends Test>{
    private Factory<T> f;

    public Product(Factory<T> f) {
        this.f = f;
    }

    public T Construct(String s){
        return f.create(s);
    }
}

}

运行此打印:

Test_Child constructed with string 'Test'

我不明白的是:

1、为什么不必提供参数 Test_Child::new 2、调用如何f.create()在Product实例指的构造函数Test_Child的类。


问题来源:stackoverflow

展开
收起
七天一失眠 2020-03-28 11:09:11 856 0
1 条回答
写回答
取消 提交回答
  • 做一个优秀的阿里云志愿者

    1、该方法等待Factory 作为输入参数:

    public static TestBuilder create(Factory f)

    并且Factory是只有一种方法的接口:

    interface Factory { T create(String s); }

    这有效地使其成为一个功能性接口,可以通过简单地传递lambda:(Function<String, T>一个创建Tfrom 类型的实例的函数String)来实现。Test_Child::new是lambda,因为它消耗String和产生T。 2、如前所述Factory是一个函数,需要一个String并创建一个T。通过调用方法create,我们正在调用该函数。


    答案来源:stackoverflow

    2020-03-28 11:10:18
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
建立联系方法之一 立即下载
继承与功能组合 立即下载
低代码开发师(初级)实战教程 立即下载