尝试学习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运算符
答案 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;