在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的哪些属性实现了? 我能读到更多关于此的内容吗?
谢谢!
答案 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>