在查看一些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
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。