当前位置: 首页 > 知识库问答 >
问题:

java泛型问题。为什么会这样?

冉德元
2023-03-14
public interface IPage<T> extends Serializable {
    /** @deprecated */
    @Deprecated
    default String[] descs() {
        return null;
    }

    /** @deprecated */
    @Deprecated
    default String[] ascs() {
        return null;
    }

    List<OrderItem> orders();

    default Map<Object, Object> condition() {
        return null;
    }

    default boolean optimizeCountSql() {
        return true;
    }

    default boolean isSearchCount() {
        return true;
    }

    default long offset() {
        return this.getCurrent() > 0L ? (this.getCurrent() - 1L) * this.getSize() : 0L;
    }

    default long getPages() {
        if (this.getSize() == 0L) {
            return 0L;
        } else {
            long pages = this.getTotal() / this.getSize();
            if (this.getTotal() % this.getSize() != 0L) {
                ++pages;
            }

            return pages;
        }
    }

    default IPage<T> setPages(long pages) {
        return this;
    }

    default void hitCount(boolean hit) {
    }

    default boolean isHitCount() {
        return false;
    }

    List<T> getRecords();

    IPage<T> setRecords(List<T> records);

    long getTotal();

    IPage<T> setTotal(long total);

    long getSize();

    IPage<T> setSize(long size);

    long getCurrent();

    IPage<T> setCurrent(long current);

    default <R> IPage<R> convert(Function<? super T, ? extends R> mapper) {
        List<R> collect = (List)this.getRecords().stream().map(mapper).collect(Collectors.toList());
        return this.setRecords(collect);
    }

    default String cacheKey() {
        StringBuilder key = new StringBuilder();
        key.append(this.offset()).append(":").append(this.getSize());
        List<OrderItem> orders = this.orders();
        if (CollectionUtils.isNotEmpty(orders)) {
            Iterator var3 = orders.iterator();

            while(var3.hasNext()) {
                OrderItem item = (OrderItem)var3.next();
                key.append(":").append(item.getColumn()).append(":").append(item.isAsc());
            }
        }

        return key.toString();
    }
}

这是一个框架的源代码,当我使用convert()函数

default <R> IPage<R> convert(Function<? super T, ? extends R> mapper) {
        List<R> collect = (List)this.getRecords().stream().map(mapper).collect(Collectors.toList());
        return this.setRecords(collect);
    }

让我感到奇怪的是,返回类型是新类型变量R,他只是调用this.setRecords(collect);但是setRecords()函数只接收列表

IPage<T> setRecords(List<T> records);

为了验证这一点,我自己编写了一个接口,但是编译失败了

public interface IPage<T> {
    
    IPage<T> setRecords(List<T> list);

    default <R> IPage<R> convert() {
        List<R> collect = new ArrayList<>();
        return this.setRecords(collect);  //error
    }
    
}

共有1个答案

姬承教
2023-03-14

my-batis plus的源代码包含一个对IPage的附加强制转换,以更改this的类型。

方法代码为:

default <R> IPage<R> convert(Function<? super T, ? extends R> mapper) {
    List<R> collect = this.getRecords().stream().map(mapper).collect(toList());
    return ((IPage<R>) this).setRecords(collect);
}
 类似资料:
  • 问题内容: 我正在看一些具有以下形式的Java类: 我在这里使用“可比较”只是为了说明通用参数“ E”的可能用法。泛型/继承的这种用法是否有名称?它是干什么用的? 我的印象是,这允许抽象类提供方法的通用实现(例如compareTo),而不必在子类中提供它。但是,在此示例中,与继承的方法不同,它将限制子类在同一子类的其他实例(而不是任何“ A”子类)上调用compareTo。听起来对吗? 无论如何,

  • 问题内容: 在Java中,Map接口定义为 为什么不? 我刚遇到一个讨厌的错误,因为使用了错误的类型密钥。我认为泛型的目的是在编译期间及早捕获类型错误。这会达到目的吗? 问题答案: 凯文·布罗里恩(Kevin Bourrillion)不久前就在博客上发表了文章。摘要: 一致地,除非有必要防止集合损坏,否则Java Collections Framework(以及Google Collections

  • 问题内容: 我正在使用泛型编写某些东西,令我惊讶的是,我发现这行不通: 那我不能实例化泛型吗?没有任何方法可以做到这一点吗? 问题答案: 是的,这真是令人讨厌。 我使用的解决方法是强制客户端在构造新类时传递类-即 然后您可以使用。

  • 为什么需要泛型 前言 泛型程序最早出现1970年代的CLU和Ada语言中, 后来被许多机遇对象和面向对象的语言锁采用 1993年C++在3.0版本中引入的模板技术就属于泛型编程 1994年7月ANSI/ISO C++标准委员会通过的STL更是泛型编程的集大成者, 它已被纳入1998年9月C++标准之中. 2004年9月Java在J2SE 5.0(JDK 1.5)中开始使用泛型技术; 2005年11

  • 问题内容: 鉴于: 我得到: 我还会收到关于第6行的“未经检查的演员表”警告。为什么?该是 不是 一个泛型类型- 它只是一个普通的。如何通过检查和强制转换为实例来正确实现? 注意:显然,此代码示例是我的实际代码的简化版本。真正的类和都大得多,是一个内部类的其实现中使用。 仅供参考:实数确实使用了通用参数。 问题答案: o不是通用类型-只是普通对象。 那不是问题。问题…和两个编译错误的根本原因…是泛