23

第一次用Java开发,第一次用Android开发,所以这是一个新手问题。

我目前有这个代码:

public void onBtnClicked(View v){
    /** Handles button navigation */

    @SuppressWarnings("rawtypes")
    Class c;
    int viewId = v.getId();

    switch (viewId) {

    case R.id.btnNewTourny :
        c = NewTourny.class;
        break;
    case R.id.btnTeamEditor :
        c = EditTeam.class;
        break;
    case R.id.btnCatEditor :
        c = EditCat.class;
        break;
    case R.id.btnLoadTourny :
        c = EditCat.class;
        break;
    case R.id.btnNewCategory :
        c = NewCat.class;
        break;
    default :
        c = Main.class;
    }

    Intent myIntent = new Intent(v.getContext(), c);
    startActivityForResult(myIntent, 0);
}

简短的问题:

.class属性有什么作用,f.ex 。在' c = NewTourny .class '?

为什么我不能将 c 转换为 Tourny (这是所有这些类的父级)?

长问题:

这目前处理我的应用程序中的所有按钮导航,并且工作正常。但是,如您所见,我抑制了“原始类型”警告,当我将 c 转换为 Class 时会出现这种警告。现在,我真的想要一个没有警告的代码,所以我想'好吧,所有这些类都是'Tourny'的孩子',所以我认为它可以工作,将 c 转换为 Tourny - 但这不起作用。然后我意识到,我真的不知道代码“NewTourny.class”实际上做了什么,这可能就是为什么我不能将 c 转换为 Tourny 的线索。那么,.class 有什么作用呢?

4

5 回答 5

12

它真的没有多大作用。 NewTourney.class更多的是一种语言特定的方式来编写“作为类的对象NewTourney”。这个速记允许人们引用a的NewTourney,而不是处理特定的已经存在的实例NewTourney

在您的具体情况下,我会冒险猜测最终会创建一个Activity的实例来处理操作,或者至少保存操作的上下文敏感数据。

于 2012-04-09T16:54:53.123 回答
4

类是表示类的类。:)

它不是“对象”。它不是超类,甚至不是您的“NewTourny”层次结构。这就是为什么您不能从 NewTourney 转换为 Class 的原因。

.class 属性是表示类型信息的 Class 实例。

您可以使用它进行反射样式调用,以实例化您在编译时不知道其类型的内容。

于 2012-04-09T16:58:02.037 回答
3

类的实例,其中Class表示正在运行的 Java 应用程序中的类和接口。这是 java 反射 API 的一部分。来自 Oracle教程

如果类型可用但没有实例,则可以通过将“.class”附加到类型名称来获得类。这也是获取原始类型的 Class 的最简单方法。

以下是一些参考资料:

  1. https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
  2. https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html
于 2016-09-17T16:16:32.907 回答
1

要摆脱警告,您可以更改Class cClass<? extends Tourny>. 这意味着 c 不是一个对象,它代表所有可能的类之一,但更具体地代表一个由Tourny.

于 2012-04-09T17:01:13.890 回答
1

.class 方法是所有对象都有的方法,它允许您在有机会初始化它之前引用该对象的原始性质。它不是父级,它是其自身的原始纯粹模板。它被称为“.class”,因为它是类的直接表示,只有类定义可以影响。它使您不必为了获取该类的所有成员最初共有的信息而创建一个新对象。

于 2015-02-05T20:47:16.817 回答