如何将 java 类名作为参数传递并将其用作方法中的强制转换

Posted

技术标签:

【中文标题】如何将 java 类名作为参数传递并将其用作方法中的强制转换【英文标题】:How to pass a java class name as parameter and use it as casting in method 【发布时间】:2021-01-17 20:19:57 【问题描述】:

我正在尝试实现每个活动都可以调用它的通用对话框方法。公共静态方法应该是这样的。但是我无法将 mContent 转换为其活动类名称。

  public static void  openDialogEntry(Class activityClassName, Context mContext,  String title,  ... ) 
    Dialog_Entries   dialog = new Dialog_Entries(  title,   ...  );
    dialog.show( ((activityClassName) mContext).getSupportFragmentManager(), tag);

我想从任何活动的片段中调用此方法,例如从 SecondActivity.java 的片段(视图)中使用

 openDialogEntry(view.getContext().getClass, view.getContext(),  title,  ... ) ; 

我期望做的是在 openDialogEntry 方法中执行类似下一行的操作

 dialog.show( ((SecondActivity) mContext).getSupportFragmentManager(), tag);

((activityClassName) mContext) 似乎不起作用。 我也想从 MainActivity.java 和 ThirdActivity.java 调用公共静态方法(以及它们需要转换的片段)。

如何实现这个目标?

【问题讨论】:

如果 Context 已经有一个 getSupportFragmentManager 方法,则强制转换实际上没有任何效果。 如果我从 SecondActivity 的片段中调用方法呢?我需要将其转换为访问 getSupportFragmentManager()。 对不起。我从 SecondActivity 的片段中调用该方法。问题已更改以使其清楚。 请显示所有相关代码以避免这个乒乓球。 你想调用静态方法吗?所以 mContext 在这方面真的没有任何用处。你有Class,然后通过反射获取方法并调用它。 【参考方案1】:

类有一个方法Class.cast(Object),你可以这样做:

public static void openDialogEntry(Class<? extends Context> activityClassName, Context mContext, String title, ...) 
    Dialog_Entries dialog = new Dialog_Entries(title, ...);
    dialog.show(activityClassName.cast(mContext).getSupportFragmentManager(), tag);

请注意,cast 仅在提供有关 Class 参数的通用信息时才有意义

但是正如@Zabuzard 已经提到的那样。这没有多大意义。如果可以将mContext 转换为activityClassName 为什么不使用这个类而不是Context 作为方法参数?

Context 可能实现了一些interface 或扩展了一些提供getSupportFragmentManager 方法的class。所以根本不需要投射。

【讨论】:

他们也试图通过实例调用静态方法。他们已经确定演员阵容是实现这一目标的一种方式。 @matt 我在Class 参数中添加了泛型。 openDialogEntry 是静态方法,但 getSupportFragmentManager 不是。而openDialogEntry 不属于Context。至少我找不到这个信息。 "getSupportFragmentManager is not" 你怎么知道的?然后他们甚至不需要演员,只需接受参数作为上下文。 @matt 我知道。 SoF... 为什么你认为getSupportFragmentManager 是静态的? 他们最后的声明中说“我想调用公共静态...”

以上是关于如何将 java 类名作为参数传递并将其用作方法中的强制转换的主要内容,如果未能解决你的问题,请参考以下文章

如何读取将作为 MultipartFile 参数传递的 SQLite 文件? (在 java/kotlin 中)

如何传递参数并将这些参数用作 package.json 脚本中的变量? [复制]

如何在 C# 中将 DLLImport 与结构一起用作参数?

如何将 inputsource 转换为 inputstream 并将其作为参数提供给 stringreader?

构造结构的结构并将其作为函数参数传递的有效方法

如何在Java中获取当前类名,包括包名?