Java:Class< T>和类:当从类内部/外部使用时的差异 [英] Java: Class<T> and Class: Difference when used from within/ outside of the class

查看:175
本文介绍了Java:Class< T>和类:当从类内部/外部使用时的差异的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个类,需要使用类< T> 参数(参见我以前的半相关问题)。它是:

  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);
//不编译:
// expected [int,int,Class< T>],但得到
// [int,int,Class< blah.blah.StringTableEntry>
}
...
}

构造函数(有2个参数)不工作,但是当我从外部类调用完全相同的事情,如下:

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

它编译和运行没有抱怨。

解决方案

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

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


I have a class that needs to use a Class<T> parameter (see my previous semi-related question). It is:

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>]
    }
...
}

I am wondering why the constructor (with 2 parameters) does not work, but when I am invoking the exact same thing from an external class, like this:

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

It compiles and runs without complaining. Why so, and how to work around this?

Thanks!

解决方案

A constructor for a class that has generic type parameters can be used to construct that class with any types (that fit the bounds in the class declaration). So what happens if someone says:

new BaseTable<SomeTypeUnrelatedToStringTableEntry>(rows, cols)

?

As a workaround, use a static factory method:

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

Or you can create a subclass:

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

这篇关于Java:Class&lt; T&gt;和类:当从类内部/外部使用时的差异的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆