2011-12-03 201 views
0

试图学习java泛型特性,但在使用它时,我得到一个警告,无法理解我如何解决它,虽然程序本身运行良好。在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); 

该程序工作正常,但我找到这个华日蚀中。

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

任何人都可以帮助我了解我可以如何处理此警告?

更新

我使用的春天注入myClass的实例所以不能用在这里

+0

我猜你应该指定模板参数,如'私人MyClass myClass;'声明实例时。 – Thomas

回答

2

新的运营商试试这个

public class MyClass { 

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

} 
+0

你可以expkain这是什么意思,它会帮助我了解 –

+0

退房http://docs.oracle.com/javase/tutorial/java/generics/genmethods.html如果你只想在你声明的特定方法的泛型它与<>之前返回类型 – jontro

1

你需要声明你的VAR为:

private MyClass<ClassB> myClassClassB; 

---- update

如果你不知道通用的类型开始,您可以使用此:

private MyClass<? extends Class> myClass; 

这将摆脱的警告,但我认为你不完全理解的仿制药。你想用这个完成什么?你有弹簧注入myClass变量与MyClass的实现,但泛型没有太大的帮助,因为泛型只在编译时意味着什么,并且依赖注入发生在运行时...

+0

我的错误,我忘了提及我使用春天,所以使用弹簧DI注入的单一参考 –

1

因为你声明你的方式类,Java期望在声明/初始化该类型的类时为其提供一个类型参数。因此,在这种情况下,你需要做的:

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

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

private MyClass<ClassB> myClass; 

private MyClass<ClassC> myClass; 

代替:

private MyClass myClass; 
+0

我的错误,我忘了提及我使用弹簧,因此使用弹簧DI注射的单一参考 –

1

什么您尝试实现通过调用

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

可以,如果你删除实现从你的班级。因此,通过

public class MyClass 

更换

public class MyClass<T> 

和改变方法的签名

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

我会推荐阅读Generics tutorial,但this part of the tutorial展示了如何并解释了为什么