我有一个问题是在我的班级中使用泛型.这些是我的课程:
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 次 |
| 最近记录: |