Java 在方法中使用泛型类类型

Java 在方法中使用泛型类类型,java,generics,Java,Generics,我有一个泛型类,它有一个调用另一个方法的方法,该方法需要一个类对象作为其参数之一。我希望能够使用在对象创建时设置为泛型的类类型,但我似乎不能完全正确地使用语法。以下是我想做的: public abstract class GenericClass<T> { private void doStuff() { //do a bunch of stuff //This method's signature is methodToCall(Seri

我有一个泛型类,它有一个调用另一个方法的方法,该方法需要一个类对象作为其参数之一。我希望能够使用在对象创建时设置为泛型的类类型,但我似乎不能完全正确地使用语法。以下是我想做的:

public abstract class GenericClass<T> {

    private void doStuff() {
        //do a bunch of stuff

        //This method's signature is methodToCall(Serializable s) and is not a method I can change
        methodToCall(T);
        methodToCall(Class<T>);
        methodToCall(T.class);

        //do some more stuff
    }

}

public class NonGenericClass extends GenericClass<DesiredClass> {

}
<>但是我不能轻易重写这个方法,因为我只是复制了所有的代码,因为在方法的中间需要类类型。 以下是我迄今为止提出的最好的建议:

public abstract class GenericClass<T> {

    protected abstract void doStuff();

    protected <T> void doStuff(Class<T> cls) {
        methodToCall(cls);
    }

}

public class NonGenericClass extends GenericClass<DesiredClass> {

    @Override
    protected void doStuff() {
        doStuff(DesiredClass.class);
    }

}
公共抽象类GenericClass{
受保护的抽象无效doStuff();
受保护的空隙度(cls级){
方法调用(cls);
}
}
公共类NonGenericClass扩展了GenericClass{
@凌驾
受保护的void doStuff(){
doStuff(DesiredClass.class);
}
}
这是可行的,但感觉泛型类在浪费它所拥有的关于T是什么的知识。我首先列出的调用
methodToCall
的3个版本中是否存在语法错误?这是不能做的吗


希望这一切都有意义。

如果调用的方法的参数实现了任何类型,那么必须确保使用泛型类型,
T
实现/扩展该类型

public class GenericClass<T extends Serializable>
{
    // ...
}
公共类GenericClass
{
// ...
}

如果要调用其参数实现任何类型的方法,则必须确保使用泛型类型,
T
实现/扩展该类型

public class GenericClass<T extends Serializable>
{
    // ...
}
公共类GenericClass
{
// ...
}

GenericClass
需要一个运行时类型令牌:一个
对象被传递到它的构造函数中并保存在一个字段中。代码大致与您的最佳尝试一样详细,但更标准:

class GenericClass<T> {

    Class<T> clazz;

    public GenericClass(Class<T> c) {
        clazz = c;
    }

    protected void doStuff() {
        methodToCall(clazz);
    }

}
class泛型类{
课堂讨论;
公共通用类(c类){
clazz=c;
}
受保护的void doStuff(){
方法调用(clazz);
}
}

GenericClass
需要一个运行时类型令牌:一个
对象被传递到它的构造函数中并保存在一个字段中。代码大致与您的最佳尝试一样详细,但更标准:

class GenericClass<T> {

    Class<T> clazz;

    public GenericClass(Class<T> c) {
        clazz = c;
    }

    protected void doStuff() {
        methodToCall(clazz);
    }

}
class泛型类{
课堂讨论;
公共通用类(c类){
clazz=c;
}
受保护的void doStuff(){
方法调用(clazz);
}
}

在这种情况下,如果您知道对象的实际运行时类始终将使用实际类作为类型参数来实现
GenericClass
,那么您可以从类的元数据中检索该类型参数(这里我们假设实际类是
GenericClass
的直接子类,以简化搜索):

private void doStuff(){
类clazz=(类)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
方法调用(clazz);
}

在这种情况下,如果您知道对象的实际运行时类始终将使用实际类作为类型参数来实现
GenericClass
,那么您可以从类的元数据中检索该类型参数(这里我们假设实际类是
GenericClass
的直接子类,以简化搜索):

private void doStuff(){
类clazz=(类)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
方法调用(clazz);
}

只有编译器知道类型,但由于类型擦除,它在运行时不可用。只有编译器知道类型,并且由于类型擦除,它在运行时不可用。好的,我没有意识到类是一个运行时类型标记。我一直在苦苦思索编译器是否可以推断T类型并为其创建类对象我。我的一部分仍然不想相信这是不可能的,但考虑到我不能让它编译,否则,我想我只能处理它。至少你的解决方案有点干净。好吧,我没有意识到这个类是一个运行时类型令牌。我一直在努力思考编译器可以推断t类型并创建对我来说是类对象。我的一部分仍然不想相信这是不可能的,但考虑到我不能让它编译,否则,我想我只能处理它。至少你的解决方案更干净一点。