我有一个问题是在我的班级中使用泛型.这些是我的课程:
public interface InterE<PK> {}
public interface Inter2<O extends ClassO, P extends ClassP> {}
public class ClassU<O extends ClassO, P extends ClassP> implements InterE<Long> {}
public class ClassP {}
public class ClassO {}
public class Class1<PK, T extends InterE<PK>> {
public Class1 (Class<T> clazz) {}
}
public class Class2<O extends ClassO, P extends ClassP> extends Class1<Long, ClassU<O, P>> implements Inter2<O, P> {
public Class2 () {
//old constructor
//super(ClassU.class);
//new - here is problem
super(ClassU<O, P>.class);
}
}
Run Code Online (Sandbox Code Playgroud)
如果ClassU不使用泛型,那么Class2中的旧构造函数工作正常,但我需要在ClassU中使用泛型,所以我在Class2中调用超级构造函数时遇到问题.
简短的故事:更改Class1
构造函数参数类型 - 从Class<T>
到Class<?>
。
为什么?
Class1
只需要T
延长InterE
. Class2
声明ClassU
为这个T
参数。既然ClassU
实行了InterE
,一切就OK了Class1
。
您真的需要<T>
在构造函数中提供这些信息吗Class1
?我认为不:
1)T
已经存在于类声明中:Class1<PK, T extends InterE<PK>>
,您可以在类中使用它来生成代码并使其编译时安全:
public class Class1<PK, T extends InterE<PK>> {
Map<PK, T> map = new HashMap<>(); // can still use T, compile-time safe
}
Run Code Online (Sandbox Code Playgroud)
2)什么可以Class<T>
做,什么Class<?>
不能做?- 它可以创建newInstance()
安全并做更多的事情,但你很可能不会使用这种可能性。使用还可以进行操作T
,例如调用T instance = (T) class.newInstance();
,因此您不会有任何无法克服的限制。
归档时间: |
|
查看次数: |
214 次 |
最近记录: |