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;
        }
    }

There are two things that I find I need a better understanding of when it comes to this code. First I am trying to determine the exact meaning of:

private final Class<? extends FragmentActivity> activityClass;

Secondly I am curious what is being called with super(); since when DemoDetails is defined it is defined with:

private static class DemoDetails {

So at that point there is no extends so what is being referenced by super? The use of

<? extends >

I have not ever seen before.

Thanks in advance...

4

7 に答える 7

2
private final Class<? extends FragmentActivity> activityClass;

activityClassこれはprivate、(宣言されたクラス内でのみ表示される)およびfinal(再割り当てなし)という名前のフィールドを宣言します。その型はClass<? extends FragmentActivity>(これは、パラメーター化された型またはジェネリック型の (型) インスタンス化であり、Class<T>T型パラメーターです)。ジェネリック型が使用される場合、それらはパラメーター化された型と呼ばれ、型パラメーターの型引数を提供します。ここで型引数は? extends FragmentActivity(実際には上限を持つワイルドカードであり、ここでの上限はたまたまFragmentActivity.

これは、クラス自体またはそのサブクラスのいずれかを表すインスタンスをactivityClass参照できることを意味します (例: )。ClassFragmentActivityFragmentActivity.class

于 2013-06-03T06:55:41.287 に答える
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.

このメカニズムを使用する場所は多数あります。反射はまれですが、1つです。Log4J ロガーは別のものです。

任意のオブジェクトのクラスを宣言する最も安全な方法は次のとおりです。

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

結局のところ、tは のサブクラスのインスタンスである可能性がありThing、匿名のサブクラスでさえある可能性があります。この式は、clazzClassオブジェクトであり、 の特定の型変数が のclazz、必ずしも知られていないサブクラスであるThingか、Thingそれ自体であることを意味します。

元の式に戻るとactivityClass、クラス オブジェクトFragmentActivityまたはそのサブタイプです。Class.newInstance()また、引数が0のコンストラクターがある場合、プログラムはそのインスタンスを構築できます。

于 2013-06-03T07:08:41.337 に答える
1

private- つまり、この変数はこのクラスの外ではアクセスできないことを意味します。 final- 値が割り当てられると、変更できなくなります。

したがって、プライベート最終クラスは、このファイルでのみアクセスでき、新しい値を割り当てることができないクラスです。これは定数です。

超すべてのクラスは Object を拡張します。Object のみが階層内に親を持ちません。したがって、super() は Object() を呼び出しています。おそらくそれを知らない誰かによって追加されたか、またはクラスに親があり、リファクタリングされたがその行が見落とされた可能性があります。

<? Extends FragmentActivity>- これは、クラスがジェネリックであることを意味します。その関数のいくつかは、オブジェクトの大規模なセットで動作する可能性があり、クラスをインスタンス化するときにそれを指定します。今のところ、それは ? です。Extends FragmentActivity 部分は、FragmentActivity を拡張するクラスのみが ? の有効な値であることを意味します。明らかな問題は、FragmentActivity を取得しない理由です。ジェネリックを使用すると、すべての ? 同じ型である必要がありますが、基本クラスを使用すると、型を混在させることができます。より具体的です。

EDIT:もともと大文字を逃し、クラスではなくクラスの最終的な意味を入れました。修理済み。

于 2013-06-03T06:50:20.630 に答える
0
 private final Class<? extends FragmentActivity> activityClass;

この行の意味は、activityClass は、FragmentActivity の参照変数または FragmentActivity のすべてのサブクラスのみを保持できるプライベートかつ最終的なクラスであるということです。

super(); 

これは、スーパー クラス、つまり ListActivity のコンストラクタを呼び出します。このコードを記述しない場合、コンパイラはこのコードを .class ファイルに自動的に追加します。

 <? extends temp>

つまり、このコンテナは temp の参照変数または temp のサブクラスのみを保持できます。別の ref.var を渡そうとすると、コンパイル時エラーが発生します。したがって、参照変数の型を次のように制限するのが基本です。所有。

于 2013-06-03T07:02:12.883 に答える
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

質問 1. extends がないので、super によって参照されているのは何ですか?

回答:-すべてのクラスは、デフォルトでJavaのクラスオブジェクトのサブクラスです。したがって、オブジェクトクラスの空のコンストラクターが最初に呼び出され、次にサブクラスコンストラクターが呼び出されます。

Question 2.private final 授業活動 授業の意味は?

回答:- final と宣言されたクラスはサブクラス化できません。private クラスは、同じクラス ファイル内でアクセスできるクラスであり、同じまたは異なるパッケージ内の他のクラス ファイルではアクセスできません。

これは何ですか<? extends >

Ans-it は、c++ のテンプレートと同じ java.same での一般化の実装です。

于 2013-06-03T07:04:00.763 に答える
0

では、始めましょう:

private final Class<? extends FragmentActivity> activityClass;

DemoDetails クラスは、クラスをコンストラクター引数として受け取ります。このクラスは FragmentActivity 型またはそのサブクラスでなければなりません。Class 参照を渡す用途はいくつかあります。その 1 つは、activityClass.newInstance()を使用して新しいインスタンスを作成できることです。もう 1 つは、isAssignableFrom()を使用して型の実行時チェックを行うことです。

第二に、私は super() で何が呼び出されているのか興味があります

これではまったく効果がありません。スーパークラス (オブジェクト) では何も行われませんが、常に super() を呼び出すことをお勧めします。特に、後の段階で DemoDetails を別のものから継承させることにした場合。

于 2013-06-03T06:58:08.020 に答える