【问题标题】:How does a '.class' property work?'.class' 属性如何工作?
【发布时间】:2012-04-22 00:40:16
【问题描述】:

第一次用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 有什么作用呢?

【问题讨论】:

标签: java android class


【解决方案1】:

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

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

【讨论】:

  • 这是否意味着我无法避免将 c 转换为 Class,从而避免警告?
  • c;会让它消失吗?或类> c;如果它可能甚至不是一项活动!
  • Class 抛出此错误:Type mismatch: cannot convert from Class to Class,但 Class> 有效。
【解决方案2】:

Class 是表示类的类。 :)

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

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

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

【讨论】:

  • 实际上,Class 是一个Object,它代表一个。类是对象,这是在 JVM 中操作 Class 的特殊必需品之一,它只有两种类型的数据,原语和 Object 的后代。
【解决方案3】:

类的实例,其中 Class 表示正在运行的 Java 应用程序中的类和接口。这是 java 反射 API 的一部分。来自甲骨文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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 由于 c 可以指向许多不同类型的类,它应该被声明为 Class>.
    • 将其更改为 Class c 时,我在 switch 语句的每一行中都收到此错误:Type mismatch: cannot convert from Class to Class我>
    • @Michael Krussel:消除了警告!谢谢。
    • 抱歉,必须是 Class<? extends Tourny> 而不是 Class<Tourny>
    • Class<Tourny> 表示 Tourny 类。 Class<? extends Tourny> 代表 Tourny 的一个子类。这就是泛型的工作方式。检查docs.oracle.com/javase/tutorial/extra/generics/wildcards.html
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-10
      • 2011-07-10
      • 1970-01-01
      • 2020-03-14
      • 2010-09-29
      • 2013-01-30
      • 2014-07-12
      • 1970-01-01
      相关资源
      最近更新 更多