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 {
那么在那一点上没有延伸所以超级引用了什么?使用
<? extends >
我以前从未见过。
提前致谢...
答案 0 :(得分:2)
private final Class<? extends FragmentActivity> activityClass;
声明一个名为activityClass
的字段private
(仅在声明它的类中可见)和final
(无重新分配)。它的类型是Class<? extends FragmentActivity>
(它是泛型类型Class<T>
的参数化类型或(类型)实例化,其中T
是类型参数)。使用泛型类型时,它们称为参数化类型,并为type参数提供类型参数。这里的类型参数是? extends FragmentActivity
(实际上是wildcard with an upper bound,这里的上限恰好是FragmentActivity
。
这意味着activityClass
可以引用Class
实例,该实例代表类FragmentActivity
本身或其任何子类(例如FragmentActivity.class
)。
答案 1 :(得分:1)
private-表示此变量无法在此类之外访问 final-一旦分配了值,就无法更改。
因此,私有的最终类是一个只能在此文件中访问的类,并且不能为其分配新值 - 它是常量。
super-每个类都扩展了Object。只有对象在层次结构中没有父级。所以super()调用Object()。它不是必需的,可能是由一个不知道这个的人添加的,或者是曾经有一个父级并且被重构但是错过了这一行的类。
<? Extends FragmentActivity>
- 这意味着该类是通用的。它的一些函数可以处理大量的对象,我们将在实例化类时指定它们。现在它是一个? Extends FragmentActivity部分意味着只有扩展FragmentActivity的类才是?的有效值。显而易见的问题是,为什么不让它采取FragmentActivity?使用通用限制所有?是同一类型,而采用基类可以允许它们是混合类型 - ?更具体。
答案 2 :(得分: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
的子类的实例,甚至可能是匿名子类。此表达式表示clazz
是Class
对象,clazz
的特定类型变量是Thing
的某些(不一定是已知的)子类,或者只是{{} 1}}本身。
回到原始表达式,Thing
是activityClass
或其某个子类型的类对象。如果程序具有0参数构造函数,则程序可以使用FragmentActivity
构造它的实例。
答案 3 :(得分: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
答案 4 :(得分:0)
好的,我们来看看:
private final Class<? extends FragmentActivity> activityClass;
DemoDetails类将Class作为构造函数参数。此类必须是FragmentActivity类型或其子类。传递Class引用有多种用法,一种是您可以使用activityClass.newInstance()创建新实例。另一种方法是使用runtime checks of types
进行isAssignableFrom()其次我很好奇用super()
调用什么
这绝对没有效果。超类(Object)中没有任何内容,但总是调用super()是个好主意。特别是如果您在稍后阶段决定让DemoDetails继承其他东西。
答案 5 :(得分:0)
private final Class<? extends FragmentActivity> activityClass;
这一行的含义是activityClass是private和final,它只能保存FragmentActivity的引用变量或FragmentActivity的所有子类。
super();
这将调用超类的构造函数,即ListActivity。如果不编写此代码,编译器将自动将此代码附加到.class文件中。
<? extends temp>
这个测量,这个容器只能保存temp的引用变量或temp的子类。如果一个尝试传递其他ref.var,就会发生编译时错误。所以,它基本上是限制类型的保持参考变量。
答案 6 :(得分:0)
问题1.没有延伸,所以super引用了什么?
Ans: - 默认情况下,每个类都是java中Class对象的子类 .So首先调用Object类空构造函数然后调用子类构造函数。
问题2.private final Class活动类意义?
Ans: - 声明为final的类不能被子类化。 .private类可以在同一个类文件中访问的类而不通过相同或不同包中的其他类文件。
这是<? extends >
Ans-it是在java.same中作为模板在c ++中实现泛化。