【问题标题】:Interface in generic type Java泛型 Java 中的接口
【发布时间】:2014-08-04 21:39:45
【问题描述】:

今天在jdk8源码中发现了奇怪的代码,找不到任何解释。

 static final Comparator<ChronoLocalDate> DATE_ORDER =
    (Comparator<ChronoLocalDate> & Serializable) (date1, date2) -> {
        return Long.compare(date1.toEpochDay(), date2.toEpochDay());
    };

谁能解释我为什么 & Serializable out of &lt;&gt;
提供文档链接会很棒。

来源链接:AbstractChronology

【问题讨论】:

  • 非常感谢!现在我明白了。
  • 值得注意的是,强烈建议不要使用可序列化的 lambda,因为序列化形式高度依赖于包含类的二进制形式,甚至使用不同的编译器(或它的不同版本)进行编译可能打破兼容性。特别是在这个问题的例子中,DATE_ORDER 似乎是一个单例,一个(反)序列化的 lambda 不会保留的属性。

标签: java generics interface java-8


【解决方案1】:

&amp; 在该上下文中表示类型的交集。假设你有这样的课程:

interface SomeInterface
{
  public boolean isOkay();
}

enum EnumOne implements SomeInterface { ... }

enum EnumTwo implements SomeInterface { ... }

您希望能够使用任何实现 SomeInterface 作为泛型类型中的类型参数的枚举。当然,您希望能够同时在 Enum 和 SomeInterface 上使用方法,例如分别为 compareToisOkay。这是如何做到的:

class SomeContainer<E extends Enum<E> & SomeInterface>
{
  SomeContainer(E e1, E e2)
  {
    boolean okay = e1.isOkay() && e2.isOkay();
    if (e1.compareTo(e2) != 0) { ... }
  }
}

http://docs.oracle.com/javase/specs/jls/se5.0/html/typesValues.html#4.9

【讨论】:

    【解决方案2】:

    您的问题分为两部分:

    &amp; Serializable 是什么?

    这是类型的交集 - 类型必须是 both Comparator&lt;ChronoLocalDate&gt; and Serializable

    为什么不在尖括号中&lt; &gt;

    因为它是强制转换,而不是泛型参数类型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多