Java 中的高级泛型

假设我有以下类:

public class FixExpr {
  Expr<FixExpr> in;
}

现在我想介绍一个通用参数,抽象化Expr的使用:

public class Fix<F> {
  F<Fix<F>> in;
}

但是Eclipse不喜欢这样:

F型不是通用的;它不能用参数<Fix<F>>参数化

这是否可能,或者我是否忽略了导致此特定实例中断的内容?

一些背景信息:在Haskell中,这是编写泛型函数的常用方法;我正在尝试将其移植到Java。上面示例中的类型参数 F 具有种类 * -> * 而不是通常的类型 *。在Haskell中,它看起来像这样:

newtype Fix f = In { out :: f (Fix f) }

答案 1

我认为你试图做的是Java泛型根本不支持。更简单的案例

public class Foo<T> {
    public T<String> bar() { return null; }
}

也不使用javac编译。

由于Java在编译时不知道是什么,因此它不能保证这是有意义的。例如,如果您创建了一个 ,则具有签名TT<String>Foo<BufferedImage>bar

public BufferedImage<String> bar()

这是荒谬的。由于没有机制强制您仅使用泛型 s 实例化 s,因此它拒绝编译。FooT


答案 2

也许你可以试试Scala,它是一种在JVM上运行的函数式语言,支持更高种类的泛型。


[ 编辑:拉胡尔·

以下是您的特定示例如何大致转换为Scala:

trait Expr[+A]

trait FixExpr {
  val in: Expr[FixExpr]
}

trait Fix[F[_]] {
  val in: F[Fix[F]]
}

推荐