关于说明泛型类语法的使用的示例

时间:2011-09-29 15:23:27

标签: java

在Java中思考,第566页给出了以下示例。

class CountedInteger {
  private static long counter;
  private final long id = counter++;
  public String toString() { return Long.toString(id); }
}
public class FilledList<T> {
  private Class<T> type;

  public FilledList(Class<T> type) { this.type = type; }

  public List<T> create(int nElements) {
    List<T> result = new ArrayList<T>();
    try {
       for(int i = 0; i < nElements; i++)
       result.add(type.newInstance());
    } catch(Exception e) {
      throw new RuntimeException(e);
    }
    return result;
  }

   public static void main(String[] args) {
     FilledList<CountedInteger> fl = new FilledList<CountedInteger>(CountedInteger.class);
     System.out.println(fl.create(15));
   }
} 

关于这个例子,我有三个问题。

1)私有类类型的用法是什么?为什么要私有?

2)为什么要做以下,特别是“this.type = type;”

public FilledList(Class<T> type) { this.type = type; }

3)作者声称:

  

请注意,此类必须假定它使用的任何类型   有一个默认的构造函数(一个没有参数),你会得到一个   如果不是这样的例外。

我无法弄清楚这个陈述是如何反映在上面的例子中的。感谢。

4 个答案:

答案 0 :(得分:1)

1) 不是,但这是你在Java中做的事情之一 - 不要暴露那些不需要暴露的东西。

2)将属性设置为构造函数的参数 - 即元素Java。

3)由于type.newInstance()电话;没有默认(no-arg)构造函数,它将失败。

答案 1 :(得分:0)

  1. 它不必是私有的,但通常最好隐藏类中的内部字段,除非您希望它们可以从外部访问。我还会在类型字段上加上final修饰符以防止修改。

  2. 此行将类构造函数中传递的值分配给名为type的实例字段。关键字this表示它是此实例字段。

  3. 如果相应类型没有默认构造函数,type.newInstance()代码将失败。

  4. 顺便说一下,整个事情可以用java.util.Collections.fill(list, value)电话取代。

答案 2 :(得分:0)

  1. type只是另一个实例变量。它被宣布为私人 以防止从本课程外部访问它。

  2. 创建此类FilledList的实例时,即     调用带有1个arg的构造函数,实例变量type是     使用构造函数中传递的arg值进行初始化。

  3. type.newInstance()所做的是调用默认的no args构造函数     对于这种类型,如果是默认值,这将抛出异常     构造函数是私有的。

答案 3 :(得分:0)

1:类的所有成员都应该是私有的或受information hiding保护。但你不必这样做

2:在任何方法中,您都可以访问该类中的所有参数和所有成员变量。在这种情况下,参数名称与成员变量完全相同。因此,在这种情况下,如果您编写type,参数名称将获胜。 this指向当前实例,this.type表示您指的是成员变量而不是参数。因此this.type = type就是member = parameter

3:没有参数的newInstance将在T上调用默认构造函数,如果它不存在则会抛出异常。看一下链接