Java:Class <t>和Class:从类的内部/外部使用时的差异</t>

时间:2010-01-21 05:02:44

标签: java generics class constructor parameters

我有一个类需要使用Class<T>参数(请参阅我之前的半相关question)。它是:

public class BaseTable<T extends TableEntry>
{
    protected Class<T> mClass;
    ...

    public BaseTable(int rows, int cols, Class<T> clasz)
    {
        ...
        mClass = clasz;
    }

    public BaseTable(int rows, int cols)
    {
        this(rows, cols, StringTableEntry.class);
        //Does NOT compile:
        //expected [int, int, Class<T>], but got
        //[int, int, Class<blah.blah.StringTableEntry>]
    }
...
}

我想知道为什么构造函数(带有2个参数)不起作用,但是当我从外部类调用完全相同的东西时,如下所示:

    mSomeTable = new BaseTable<StringTableEntry>(2, 2, StringTableEntry.class);

它编译并运行而不抱怨。为什么这样,以及如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:4)

具有泛型类型参数的类的构造函数可用于构造具有任何类型(适合类声明中的边界)的类。那么,如果有人说:

会发生什么
new BaseTable<SomeTypeUnrelatedToStringTableEntry>(rows, cols)

作为解决方法,请使用静态工厂方法:

public static BaseTable<StringTableEntry> newStringTableEntryBaseTable(
    int rows, int cols)
{
    return new BaseTable<StringTableEntry>(rows, cols, StringTableEntry.class);
}

或者你可以创建一个子类:

class StringTableEntryBaseTable extends BaseTable<StringTableEntry>
{
    StringTableEntryBaseTable(int rows, int cols)
    {
        super(rows, cols, StringTableEntry.class);
    }
}