有没有办法在不使用Java进行强制转换的情况下返回通用超类型?

时间:2019-04-26 09:36:10

标签: java generics

说我有这些课程:

    CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES
9aa56948cdf6        analytics-etl_webserver   "/bin/sh -c 'tail -f…"   4 minutes ago       Up 4 minutes        0.0.0.0:8080->8080/tcp   data-webserver
20db5fd63ad8        postgres:latest           "docker-entrypoint.s…"   4 hours ago         Up 33 minutes       0.0.0.0:5432->5432/tcp   data-postgres

为什么interface Field<T> {} interface Function<T> extends Field<T> {} interface UnaryFunction<INPUT, OUTPUT> extends Function<OUTPUT> {} class UnaryFunctionImpl<INPUT, OUTPUT> implements UnaryFunction<INPUT, OUTPUT> { public Function<INPUT> asField() { return (Function<INPUT>) this; } } 需要强制转换?从理论上讲这是不合理的,还是编译器不够聪明?

2 个答案:

答案 0 :(得分:3)

答案是否定的。由于Function<INPUT>Function<OUTPUT>是不同的类型,因此您必须告诉编译器您对自己的行为负责。

答案 1 :(得分:1)

UniaryFunction<INPUT, OUTPUT>Function<OUTPUT>,但不是Function<INPUT>,因此强制转换是错误的,除非INPUT和OUTPUT是相同类型。

如果输入和输出类型相同,则代码为:

class UnaryFunction<T, T> extends Function<T> {
  public Function<T> asSupertype() {
    return this;
  }
}

...使得演员表和asSupertype()过时。