gpt4 book ai didi

Java 对象转换不能像我需要的那样工作

转载 作者:行者123 更新时间:2023-12-01 16:47:46 25 4
gpt4 key购买 nike

我正在 Java 上开发 native Android 应用程序,但遇到了一些意外的行为。看看这些类:

public class Parent<C> {

protected C mCallback;

public void setCallback(Object callback) {
mCallback = (C)callback;
}
}

class Child<T extends Vehicle>
extends Parent<Child.Callback<Vehicle>>{

public void invoke(){
mCallback.onAction(new Vehicle());
}

public interface Callback<T> {
void onAction(T vehicle);
}
}

class Vehicle {

}

现在

    Child<Vehicle> child = new Child<Vehicle>();
child.setCallback(new Object()); // I expect ClassCastException to be thrown here!
child.invoke(); //But it's thrown only here!

为什么.setCallback()方法中没有抛出ClassCastException?

为什么只有当我尝试访问Callback接口(interface)的方法时才会抛出?

如何检查对象回调是 C 的实例?或者我如何至少在 setCallback() 方法中获得 ClassCastException?

附注这是简化的例子!请在这里考虑相同但现实生活中的问题:How to check typed callback type inside Fragment.onAttach()

<小时/>

@luckydog32在评论中提出的解决方案之一here

public abstract class Parent<C> {

protected C mCallback;

public void setCallback(Object callback) {
mCallback = castCallback(callback);
}

protected abstract C castCallback(Object callback) throws ClassCastException;
}

class Child<T extends Vehicle>
extends Parent<Child.Callback<Vehicle>>{
@Override
protected Callback<Vehicle> castCallback(Object callback) throws ClassCastException {
return (Callback<Vehicle>)callback;
}

public void invoke(){
mCallback.onAction(new Vehicle());
}

public interface Callback<T> {
void onAction(T vehicle);
}
}

最佳答案

您不能转换为 C,因为它在运行时不存在(即仅编译时),请在 setCallback 定义中使用 C 而不是 Object

关于Java 对象转换不能像我需要的那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46750211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com