在java中使用泛型类型

时间:2011-12-03 15:53:50

标签: java generics

尝试学习java通用功能,但在使用它时我收到警告,无法理解我如何解决它,尽管程序本身运行正常。

我创建了一个带有以下签名的课程

public class MyClass<T> {

    public T demo(String string,Class<T> type){
        // some work 
    }

}

现在在我的其他课程中,我宣布此课程的实例如下:

private MyClass myClass;

并且我试图从某些地方调用此方法,如

(ClassB)myClass.demo("hello",ClassB.class);
(ClassC)myClass.demo("hello",ClassC.class);

程序工作正常,但我在eclipse中发现了这个警告。

Type safety: The method demo(String, Class) belongs to the raw type MyClass. References to generic 
 type MyClass<T> should be parameterized

任何人都可以帮助我理解我如何处理这个警告吗?

更新

我使用spring注入myClass实例,所以不能在这里使用new运算符

5 个答案:

答案 0 :(得分:2)

试试这个

public class MyClass {

public <T> T demo(String json,Class<T> type){
    // some work  
}

}

答案 1 :(得分:1)

您需要将var声明为:

private MyClass<ClassB> myClassClassB;

----更新

如果您最初不知道通用类型,可以使用:

private MyClass<? extends Class> myClass;

这将消除警告,但我认为你还没有完全理解泛型。你想用这个来完成什么?你正在使用MyClass实现spring注入你的myClass变量,但是Generics没有多大帮助,因为泛型只在编译时意味着什么,并且依赖注入在运行时发生......

答案 2 :(得分:1)

由于您声明类的方式,Java期望在声明/初始化该类的类时为其指定类型参数。所以在这种情况下你需要这样做:

private MyClass<ClassB> myclass = new MyClass<ClassB>();

答案 3 :(得分:1)

通过调用

尝试实现的目标
(ClassB)myClass.demo("hello",ClassB.class);
(ClassC)myClass.demo("hello",ClassC.class);
如果您从班级中删除<T>,则可以获得

。所以替换

public class MyClass<T>

通过

public class MyClass

并将方法的签名更改为

public <T> T demo(String json,Class<T> type)

我建议您阅读Generics tutorial,但this part of the tutorial会说明原因

答案 4 :(得分:0)

基本上,您的类定义public class MyClass<T>告诉编译器MyClass使用泛型类型。但是当您在private MyClass<SomeType> myClass;中创建它的实例时,您没有提供要使用的类型。 使用:

private MyClass<ClassB> myClass;

private MyClass<ClassC> myClass;

而不是:

private MyClass myClass;