Discuss / Java / 类型不一致可以编译通过吗

类型不一致可以编译通过吗

Topic source

Alive

#1 Created at ... [Delete] [Delete and Lock User]

想问一下廖老师:

LazyDataSource这个类的getConnection方法里面, 创建的是Connection实例conn.

然后直接传给了LazyConnectionProxy, 我理解应该是作为构造方法的参数传入了对吧.

但是LazyConnectionProxy的构造方法里面定义的不是Supplier<Connection>泛型吗, 

那不就变成supplier = conn, 这样为什么是可以的呢, 是我哪一块知识点miss掉了吗?

Alive

#2 Created at ... [Delete] [Delete and Lock User]

换个角度,  如果是从lambda表达式理解的话. 按照Lambda基础那一节的理解, 我是这么想的:

Arrays.sort()方法, 要么传入的对象实现了Comparable<T>接口, 要么传入一个Comparator实例

总的来说都是因为排序的过程要用到compareTo()方法对吗.

那么以此类推的话, 相当于LazyConnectionProxy的构造方法里面需要用到下面这个方法吧

() -> {
            try {
                Connection conn = DriverManager.getConnection(url, username, password);
                System.out.println("Open connection: " + conn);
                return conn;
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }

无法理解

Alive

#3 Created at ... [Delete] [Delete and Lock User]

我试了一下, 应该不是第一种, 这个是我理解有问题.

那么只能按照lambda表达式理解了, 可以还是没明白

廖雪峰

#4 Created at ... [Delete] [Delete and Lock User]

你的理解是错的,LazyConnectionProxy的构造方法参数是Supplier,传入lambda类型就是Supplier,你需要回头看函数式编程

廖雪峰

#5 Created at ... [Delete] [Delete and Lock User]
Supplier<Connection> sp = () -> {
    try {
        Connection conn = DriverManager.getConnection(url, username, password);
        System.out.println("Open connection: " + conn);
        return conn;
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }
});
Connection conn = new LazyConnectionProxy(sp);

  • 1

Reply