Java泛型类令牌

Java泛型类令牌,java,android,generics,reflection,Java,Android,Generics,Reflection,我想将请求封装到我的android服务中,因为该服务具有生成适当命令的信息。但是,我想限制从ICommand发送到扩展服务的类令牌,这样我就不允许发送带有无效令牌的请求。这将进一步解释: public class ServiceRequestArgs implements Serializable { private static final long serialVersionUID = -7484807396752170166L; private Class m_toke

我想将请求封装到我的android服务中,因为该服务具有生成适当命令的信息。但是,我想限制从ICommand发送到扩展服务的类令牌,这样我就不允许发送带有无效令牌的请求。这将进一步解释:

public class ServiceRequestArgs implements Serializable {

    private static final long serialVersionUID = -7484807396752170166L;

    private Class m_token; 
    //warning: references to generic type Class<T> should be parameterized
    private IFileUploadListener m_listener;

    public <T extends ICommand> ServiceRequestArgs(
        Class<T> cmdClass, IFileUploadListener listener)
    {
        m_token = cmdClass;
        m_listener = listener;
    }

    public Class getClassToken() //warning: references to generic...
    {
        return m_token;
    }

    public IFileUploadListener getListener()
    {
        return m_listener;
    }
}

//use ->
Intent intent = new Intent(this, MyService.class);
intent.putExtra("svc_command", 
    new ServiceRequestArgs(GetListCommand.class, m_listener);
bindService(intent, m_serviceConnection, 0);
公共类ServiceRequestArgs实现可序列化{
私有静态最终长serialVersionUID=-7484807396752170166L;
私有类m_令牌;
//警告:对泛型类型类的引用应参数化
私人IFileUploadListener m_listener;
公共服务请求参数(
类cmdClass,IFileUploadListener(侦听器)
{
m_token=cmdClass;
m_listener=监听器;
}
公共类getClassToken()//警告:对泛型的引用。。。
{
返回m_令牌;
}
公共IFileUploadListener getListener()
{
返回m_侦听器;
}
}
//使用->
Intent Intent=新的Intent(这个,MyService.class);
intent.putExtra(“svc_命令”,
新的ServiceRequestArgs(GetListCommand.class,m_listener);
bindService(intent,m_serviceConnection,0);
我理解C#泛型约束,但我不确定应该如何在Java中使用它

编辑
以下是我的想法:

public class ServiceRequestArgs<T extends ICommand> {

    private ServiceRequestArgs(Class<T> token, IFileUploadListener listener);

    public Class<T> getClassToken(); //...
    public IFileUploadListener getListener(); //...

    //to make it easier to call. sorry, cant remember where I found this.
    public <C extends ICommand> ServiceRequestArgs<C> create(
        Class<C> token, IFileUploadListener listener)
    {
        return new ServiceRequestArgs<C>(token, listener);
    }
}
公共类ServiceRequestArgs{
私有ServiceRequestArgs(类令牌,IFileUploadListener侦听器);
公共类getClassToken();/。。。
公共IFileUploadListener getListener();/。。。
//为了方便打电话。对不起,我不记得在哪里找到的。
公共服务请求参数创建(
类标记,IFileUploadListener(侦听器)
{
返回新的ServiceRequestArgs(令牌、侦听器);
}
}

我将把它实现为一个泛型类,而不是试图实现一个泛型构造函数:

public class ServiceRequestArgs<T extends ICommand> {

    private Class<T> m_token;
    private ICommand m_listener;

    public ServiceRequestArgs(Class<T> cmdClass, ICommand listener)
    {
        m_token = cmdClass;
        m_listener = listener;
    }

    public Class<T> getClassToken()
    {
        return m_token;
    }

    public IFileUploadListener getListener()
    {
        return m_listener;
    }
}
公共类ServiceRequestArgs{
私有类m_令牌;
专用ICommand m_侦听器;
公共服务请求参数(类cmdClass、ICommand侦听器)
{
m_token=cmdClass;
m_listener=监听器;
}
公共类getClassToken()
{
返回m_令牌;
}
公共IFileUploadListener getListener()
{
返回m_侦听器;
}
}

这样,泛型类型
T
(约束和全部)在整个类中都是可用的。大多数情况下,泛型构造函数(对于非泛型类)。

我会将其作为泛型类实现,而不是尝试实现泛型构造函数:

public class ServiceRequestArgs<T extends ICommand> {

    private Class<T> m_token;
    private ICommand m_listener;

    public ServiceRequestArgs(Class<T> cmdClass, ICommand listener)
    {
        m_token = cmdClass;
        m_listener = listener;
    }

    public Class<T> getClassToken()
    {
        return m_token;
    }

    public IFileUploadListener getListener()
    {
        return m_listener;
    }
}
公共类ServiceRequestArgs{
私有类m_令牌;
专用ICommand m_侦听器;
公共服务请求参数(类cmdClass、ICommand侦听器)
{
m_token=cmdClass;
m_listener=监听器;
}
公共类getClassToken()
{
返回m_令牌;
}
公共IFileUploadListener getListener()
{
返回m_侦听器;
}
}

这样,泛型类型
T
(约束和全部)在整个类中都是可用的。大多数情况下,泛型构造函数(对于非泛型类)。

您希望首先使类成为泛型的。构造函数不应该有自己的泛型参数

所以

公共类ServiceRequestArgs实现可序列化{
私有静态最终长serialVersionUID=-7484807396752170166L;
私有类m_令牌;
//警告:对泛型类型类的引用应参数化
私人IFileUploadListener m_listener;
公共服务请求参数(
类cmdClass,IFileUploadListener(侦听器)
{
m_token=cmdClass;
m_listener=监听器;
}
公共类getClassToken()//警告:对泛型的引用。。。
{
返回m_令牌;
}
公共IFileUploadListener getListener()
{
返回m_侦听器;
}
}

首先要使类成为泛型。构造函数不应该有自己的泛型参数

所以

公共类ServiceRequestArgs实现可序列化{
私有静态最终长serialVersionUID=-7484807396752170166L;
私有类m_令牌;
//警告:对泛型类型类的引用应参数化
私人IFileUploadListener m_listener;
公共服务请求参数(
类cmdClass,IFileUploadListener(侦听器)
{
m_token=cmdClass;
m_listener=监听器;
}
公共类getClassToken()//警告:对泛型的引用。。。
{
返回m_令牌;
}
公共IFileUploadListener getListener()
{
返回m_侦听器;
}
}

我想知道如果类参数中有类型,是否需要将令牌传递给构造函数。因此…ServiceRequestArgs=new ServiceRequestArgs(MyListener);然而,T.class并不存在,原因非常明显。但我找不到合理的替代方案。您的评论中有问题吗?您不能将泛型类型参数
T
的类引用为
T.class
,如果这是您的问题的话。不,我觉得传递泛型参数然后T是多余的参数DoSomethingCommand.class传递给构造函数,如果我已经传递了类型,我可以使用反射来获取.class标记吗?我仍然需要传递该类(好的,我可以传递一个标识符来确定在另一端构造什么,但我很固执)。我最后做的是创建一个静态create方法。我试图看看如果我在类参数中有类型,是否需要将令牌传递给构造函数。因此…ServiceRequestArgs=new ServiceRequestArgs(MyListener);然而,T.class并不存在,原因非常明显。但我找不到合理的替代方案。您的评论中有问题吗?您不能将泛型类型参数
T
的类引用为
T.class
,如果您是这样问的话。不,我觉得通过g是多余的