4
package com.example.mapdemo;

import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;

import com.example.mapdemo.view.FeatureView;

/**
 * The main activity of the API library demo gallery.
 * <p>
 * The main layout lists the demonstrated features, with buttons to launch them.
 */
public final class MainActivity extends ListActivity {

    /**
     * A simple POJO that holds the details about the demo that are used by the List Adapter.
     */
    private static class DemoDetails {
        /**
         * The resource id of the title of the demo.
         */
        private final int titleId;

        /**
         * The resources id of the description of the demo.
         */
        private final int descriptionId;

        /**
         * The demo activity's class.
         */
        private final Class<? extends FragmentActivity> activityClass;

        public DemoDetails(
                int titleId, int descriptionId, Class<? extends FragmentActivity> activityClass) {
            super();
            this.titleId = titleId;
            this.descriptionId = descriptionId;
            this.activityClass = activityClass;
        }
    }

当涉及到这段代码时,我发现有两件事我需要更好地理解。首先,我试图确定以下内容的确切含义:

private final Class<? extends FragmentActivity> activityClass;

其次,我很好奇 super() 叫什么;因为当 DemoDetails 被定义时,它被定义为:

private static class DemoDetails {

所以那时没有扩展,那么 super 引用了什么?指某东西的用途

<? extends >

我以前从未见过。

提前致谢...

4

7 回答 7

2
private final Class<? extends FragmentActivity> activityClass;

这声明了一个名为activityClasswhich的字段private(仅在声明它的类中可见)和final(没有重新分配)。它的类型是Class<? extends FragmentActivity>(它是参数化类型或泛型类型的(类型)实例化Class<T>,其中T是类型参数)。当使用泛型类型时,它们被称为参数化类型并为类型参数提供类型参数。这里的类型参数是? extends FragmentActivity(它实际上是一个带有上限的通配符,而这里的上限恰好是FragmentActivity.

这意味着activityClass可以引用Class代表类FragmentActivity本身或其任何子类(例如FragmentActivity.class)的实例。

于 2013-06-03T06:55:41.287 回答
1

私有的——这意味着这个变量不能在这个类之外被访问 final——一旦被赋值,它就不能被改变。

所以私有最终类是一个只能在这个文件中访问的类,不能被赋予一个新的值——它是一个常量。

超级每个类都扩展了 Object。只有 Object 在层次结构中没有父级。所以 super() 正在调用 Object()。它不是必需的,可能是由不知道这一点的人添加的,或者该类曾经有一个父级并被重构但该行被遗漏了。

<? Extends FragmentActivity>- 这意味着该类是泛型的。它的一些函数可以处理大量对象,我们将在实例化类时指定。现在它是一个?Extends FragmentActivity 部分意味着只有扩展 FragmentActivity 的类才是有效的 ? 值。显而易见的问题是,为什么不直接使用 FragmentActivity 呢?使用泛型会限制所有 ? 是相同的类型,而采用基类可以允许它们是混合类型 - ?更具体。

编辑:最初错过了一个大写字母,并将 final 的含义用于类,而不是类。固定的。

于 2013-06-03T06:50:20.630 回答
1

理解声明

private final Class<? extends FragmentActivity> activityClass;

以及对应的构造函数参数,记得Object有一个getClass()方法:

public final Class<?> getClass();

此外,如果您有一个命名类型(没有匿名子类化),那么您可以使用.class

String s = "a string";
assert s.getClass().equals(String.class);
// String.class is a Class<String> object.

有很多地方可以使用这种机制。反射是其中之一,尽管很少见。Log4J 记录器是另一个。

声明任意对象的类的最安全方法是:

Thing t = ...;  // assume not null.
Class<? extends Thing> clazz = t.getClass();

毕竟,t可能是 的子类的实例,Thing甚至可能是匿名子类。这个表达式意味着 thatclazz是一个Class对象,特定的类型变量clazz是 的某个、不一定知道的子类Thing,或者可能只是Thing它本身。

回到原来的表达式,activityClass是一个类对象FragmentActivity或者它的某个子类型。Class.newInstance()如果程序具有 0 参数构造函数,则程序可以构造它的实例。

于 2013-06-03T07:08:41.337 回答
0
private final Class activityClass;

将阻止其他课程扩展您的课程。您也可以使用方法来执行此操作,这样您的方法就不会被覆盖。 http://docs.oracle.com/javase/tutorial/java/IandI/final.html提供了更多信息

super();

将调用父级的构造函数(在这种情况下是您扩展的 ListActivity) http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

于 2013-06-03T06:55:42.303 回答
0

好的,让我们开始吧:

private final Class<? extends FragmentActivity> activityClass;

DemoDetails 类将Class作为构造函数参数。此类必须是 FragmentActivity 类型或其子类。传递 Class 引用有多种用途,一种是您可以使用activityClass.newInstance()创建新实例。另一种是使用isAssignableFrom()对类型进行运行时检查

其次,我很好奇 super() 叫什么

这完全没有效果。超类 (Object) 中没有任何事情发生,但始终调用 super() 是个好主意。特别是如果您在稍后阶段决定让 DemoDetails 从其他东西继承。

于 2013-06-03T06:58:08.020 回答
0
 private final Class<? extends FragmentActivity> activityClass;

这一行的意思是activityClass是一个private和final,它只能保存FragmentActivity的引用变量或FragmentActivity的所有子类。

super(); 

这将调用超类即ListActivity的构造函数。如果您不编写此代码,编译器将自动将此代码附加到.class文件中。

 <? extends temp>

这意味着,这个容器只能保存 temp 的引用变量或 temp 的子类。如果尝试传递其他 ref.var,则会发生编译时错误。因此,基本上是将引用变量的类型限制为抓住。

于 2013-06-03T07:02:12.883 回答
0

问题 1. 没有扩展,那么 super 引用了什么?

Ans:-默认情况下,Java 中的每个类都是 Class Object 的子类。因此,首先调用 Object 类的空构造函数,然后调用子类构造函数。

问题2.private final Class activity 类的含义?

回答:-声明为 final 的类不能被子类化。私有类是可以在同一个类文件中访问的类,而不是由相同不同包中的其他类文件访问的类。

这是什么<? extends >

Ans-it 是 java 中泛化的实现。与 c++ 中的模板相同。

于 2013-06-03T07:04:00.763 回答