'.class'属性如何工作?

时间:2012-04-09 16:49:37

标签: java android class

首次使用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(这是所有这些类的父级)?

长问题:

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

5 个答案:

答案 0 :(得分:11)

它实际上并没有NewTourney.class更像是一种语言特定的方式来编写“NewTourney类的对象”。这个简写允许人们引用 a NewTourney,而不是处理NewTourney的特定已存在的实例。

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

答案 1 :(得分:3)

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

  

如果类型可用但没有实例,则可以通过附加" .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

答案 2 :(得分:2)

Class是一个表示类的类。 :)

它不是"对象"。它不是超类,甚至不是你的" NewTourny"层次结构。这就是为什么你不能从NewTourney演绎到一个班级。

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

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

答案 3 :(得分:1)

要删除警告,您可以使用Class c更改Class<? extends Tourny>。这意味着c不是一个对象,它代表所有可能的类之一,但更具体地表示由Tourny派生的类。

答案 4 :(得分:1)

.class方法是所有objets都允许您在有机会初始化之前引用该对象的原始性质。它不是父母,它本身就是原始的纯粹模板。它被称为&#34; .class&#34;因为它只是类定义可以影响的类的直接表示。它使您不必创建新对象,以获取该类最初具有共同点的所有成员的信息。