我想在java类中扩展一个jython类
public class JavaClass extends JythonClass
如何导入Jython类?它必须编译吗?文档链接已经很有用了。
示例:
class JythonClass(threading.Thread):
def do(self):
print("hallo")
-
public class JavaClass extends JythonClass
{
public void hello()
{ System.out.print("hallo")}
}
答案 0 :(得分:9)
您可以使用Java扩展Jython类,以便通过创建扩展Java“子类”和Jython“超类”的Jython类,使结果在Jython 中可用。假设你有这个Jython类:
class JythonClass(object):
def get_message(self):
return 'hello'
def print_message(self):
print self.get_message()
您可以部分创建Java类,而无需扩展任何内容:
public class JavaClass {
private String message;
public String get_message() {
return message;
}
protected JavaClass(String message) {
this.message = message;
}
}
然后在Jython中引起“扩展”关系:
from javapackage import JavaClass as _JavaClass
from jythonpackage import JythonClass
class JavaClass(_JavaClass, JythonClass):
pass
现在这将有效:
obj = JavaClass('goodbye')
obj.print_message()
如果你希望用Java扩展一个Jython类,并像普通的Java类一样使用它,最简单的方法就是使用组合而不是继承:
答案 1 :(得分:2)
我认为Ch10 of The Definitive Guide to Jython
涵盖了这一点在此示例中,作者使用接口BuildingType
,可以将其更改为抽象类
public abstract class BuildingType {
public abstract String getBuildingName();
public abstract String getBuildingAddress();
public abstract String getBuildingId();
@Override
public String toString(){
return "Abstract Building Info: " +
getBuildingId() + " " +
getBuildingName() + " " +
getBuildingAddress();
}
}
您可以使用自己的方法进行扩展,在这种情况下,我添加了toString()
并将其用于' print'而不是作者的原始代码:
public class Main {
private static void print(BuildingType building) {
System.out.println(building.toString());
}
public static void main(String[] args) {
BuildingFactory factory = new BuildingFactory();
BuildingType building1 = factory.create("BUILDING-A", "100 WEST MAIN", "1")
print(building1);
BuildingType building2 = factory.create("BUILDING-B", "110 WEST MAIN", "2");
print(building2);
BuildingType building3 = factory.create("BUILDING-C", "120 WEST MAIN", "3");
print(building3);
}
}
您可以使用Jython权威指南CH10中的代码复制此代码,并且所有功劳都必须归功于作者 - 我只将Interface
更改为Abstract
类
您还要考虑在界面中使用Java 7 Default方法