Java:这段代码是如何工作的(返回类型未定义)

时间:2010-01-27 17:58:30

标签: java

在Sun扩展的RMI教程中,他们有一些有趣的代码实现了“计算引擎”,使用RMI将函数传递给计算引擎,然后返回结果。更多详情:http://java.sun.com/docs/books/tutorial/rmi/designing.html

这意味着在开始时返回类型是未知的,因此它们使用以下解决方法:

package compute;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Compute extends Remote {
    <T> T executeTask(Task<T> t) throws RemoteException;
}

和     包计算;

public interface Task<T> {
    T execute();
}

这是如何工作的? java的哪些属性实现了? 我能读到更多关于此的内容吗?

谢谢!

5 个答案:

答案 0 :(得分:2)

这称为Java Generics

为了更深入,Angelika Langer的FAQ非常出色。

答案 1 :(得分:2)

这是使用泛型。你可以在这里阅读更多 http://java.sun.com/developer/technicalArticles/J2SE/generics/

更具体地说,从上面的链接复制

“这里,T表示集合中包含的元素类型。将T视为占位符,将被具体类型替换”

答案 2 :(得分:2)

  

此代码如何工作(返回类型未定义)

此代码使用 generics T称为泛型类型参数。返回类型实际上并不是“未定义”。相反,我们说它是参数化:返回类型最终将被真实的具体类型替换。也就是说,返回类型是由您创建的Task<T>种类定义的。

您可以将此视为接受特定类型的函数,并生成所请求的每个Task<T>的专用版本。 (这不是封面下发生的事情 - 实际上,编译器最终会丢弃有关通用对象的运行时类型的信息 - 但是更深入的处理可能超出了StackOverflow答案的范围。)

在编写此代码时,Java编译器将确保没有关于Task<T>的创建及其与execute()方法的关系的规则被破坏。例如,编译器会将此标记为非法:

public class Boat { ... }
public class Car { ... }

public CarFactory implements Task<Car> {
  public Boat execute() { ... } // Error! A Boat is not a Car.
}

答案 3 :(得分:0)

返回类型定义的,它的类型为T.代码说明了Compute接口必须实现一个名为executeTask的方法。该方法的签名必须采用参数化任务并返回与任务相同的参数类型。所以有效的签名应该是:

Object executeTask(Task<Object> t){...}
Integer executeTask(Task<Integer> t){...}

答案 4 :(得分:0)

除了泛型之外,还有另一个概念在起作用:Java RMI提供的远程类加载器。

如果“计算引擎”启用了远程类加载(要求它具有SecurityManager,以防止客户端运行恶意任务),它可以在运行时从客户端加载新类。 / p>