java编译器采用bridge方法来兼容本该使用泛型的地方使用了非泛型的用法的问题。
如下代码:
public class TestBridgeMethod {
public static void main(String[] args) {
P p = new S();
p.test(new Object());
}
}
class P<T> {
public T test (T t){
return t;
}
}
class S extends P<String> {
@Override
public String test(String t) {
return t;
}
}
p引用的是S的对象,但S的test方法返回值是String,在jdk1.4中没有泛型,就不会对p.test(new Object());进行检查,这样在调用的时候就会报ClassCastException
声明p的时候使用P<String> p就不会有这样的问题了。
为了兼容非泛型的代码,java编译器为test生成了两个方法。看下面的代码:
import java.lang.reflect.Method;
import java.util.Arrays;
public class TestBridgeMethod {
public static void main(String[] args) {
Class<?> clazz = S.class;
Method[] methods = clazz.getMethods();
for(Method method : methods) {
System.out.println(method.getName() + ":" + Arrays.toString(method.getParameterTypes()) + method.isBridge());
}
}
}
class P<T> {
public T test (T t){
return t;
}
}
class S extends P<String> {
@Override
public String test(String t) {
return t;
}
}
运行结果为:
test:[class java.lang.String]false
test:[class java.lang.Object]true
getClass:[]false
hashCode:[]false
equals:[class java.lang.Object]false
toString:[]false
notify:[]false
notifyAll:[]false
wait:[long, int]false
wait:[]false
wait:[long]false
编译器为S生成了两个test方法,一个参数为String,用于泛型。一个参数为Object,用于非泛型,这个方法就是bridge方法,调用method.isBridge返回true
分享到:
相关推荐
from javabridge import start_jvm, get_class, get_method, call_static_method start_jvm() # 启动 JVM StringClass = get_class("java/lang/String") # 获取 Java String 类 printlnMethod = get_method(String...
from javabridge import get_env, start_vm, call_method start_vm(class_path=["path/to/your/classes"]) # 加载 Java 类 jb_object = get_env().find_class("com/example/YourJavaClass") # 创建 Java 对象 ...
2. **部署JavaBridge.jar**:将JavaBridge.jar放在服务器的适当位置,并确保Java守护进程可以访问。 3. **配置PHP**:将Java.inc添加到PHP的include_path中,以便PHP脚本可以轻松地引入和使用。 4. **启动Java守护...
如果需要后台运行,可使用`nohup java -jar JavaBridge.jar SERVLET_LOCAL:8080 > JavaBridge.log &`,这样即使关闭终端窗口也能继续运行。 2. **配置PHP项目** - 将`Java.inc`文件放到PHP项目的指定目录(如`...
Jni(Java Native Interface)是sun提供的java与系统中的原生方法交互的技术(在windows\linux系统中,实现java与native method互调)。目前只能由c/c++实现。后两个都是sourceforge上的开源项目,同时也都是基于jni...
$url = 'http://your_server:port/JavaBridge/?java=com.example.MyClass&method=myMethod'; // 添加参数,如果有的话 $params = http_build_query(['param1' => 'value1', 'param2' => 'value2']); // 使用cURL发送...
Java调用VTK不仅可以实现基本的3D渲染,还可以结合其他Java库,如ParaView Glance或 itk-jvtk-bridge,用于更复杂的可视化任务,如并行计算、大数据可视化和网络应用。 总的来说,Java调用VTK提供了一种在Java环境...
在Java中,由于Java本身并不直接支持与Windows API交互,因此需要借助第三方库来实现,其中Jacob(Java COM Bridge)是一个常用的解决方案。 Jacob是一个开源Java库,它提供了Java到COM(Component Object Model)...
bridge.callMethod("callFromQt", "(Ljava/lang/String;)V", QAndroidJniObject::fromString("Hello from Qt").object()); ``` 6. **运行和调试**:确保你的Qt应用和Android项目配置正确,然后在Android设备或...
javaweb/javaee 常用jar包,亲测可用,若需其他版本其他jar包请留言我看到后会上传分享
Jacob全称为Java COM Bridge,它是一个开源的Java库,允许Java应用程序利用COM(Component Object Model)接口来调用Windows上的COM组件,比如Microsoft Office套件中的Word。 在Java中,由于其原生不支持对Office...
结构型模式如适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰(Decorator)、外观(Facade)、享元(Flyweight)和代理(Proxy),主要关注如何组合不同的类和对象以实现新的功能。行为型模式如策略...
JACOB(JavaCOM Bridge)是一个Java到COM桥接库,它允许Java程序调用COM组件,如Microsoft Word。在Java项目中引入JACOB库,你可以通过以下步骤实现: 1. 下载JACOB的jar文件(通常为`jacob.jar`)及其对应的本地...
7. 桥接模式(Bridge):将抽象部分与实现部分分离,使它们可以独立变化。Java中,桥接模式常用于将接口和其实现分离,提高扩展性。 8. 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构...
桥接模式(Bridge)将抽象部分与其实现部分分离,使它们可以独立变化,提供更大的灵活性。这些模式的组合使用可以帮助开发者构建更复杂、更健壮的系统。 在实际项目中,设计模式的应用可以提高代码的可读性、可维护...
2. **结构型模式**:结构型模式关注如何将类或对象组合成更大的结构,如适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)、组合模式(Composite)、外观模式(Facade)和享...
2. 结构型模式:包括适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰(Decorator)、外观(Facade)、享元(Flyweight)、代理(Proxy),这些模式处理对象的组合和关系。 3. 行为型模式:如责任链...
- **JDBC-ODBC 桥驱动** (`JDBC-ODBC Bridge`): 通过 ODBC 接口与数据库通信。 - **本地库 Java 实现驱动** (`Native Library Implementation Driver`): 通过本地库与数据库通信。 - **网络协议驱动** (`Network ...
16. **模板方法模式(Template Method Pattern)**:在抽象类中定义了一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 17. **状态模式(State...