? extends tsobject extends Subject-不是类型安全的,或者只是Java可以';你不能处理它吗?
在编写此文件时? extends tsobject extends Subject-不是类型安全的,或者只是Java可以';你不能处理它吗?,java,generics,Java,Generics,在编写此文件时 import java.util.List; public class Test { public static class Subject { } public static class MySubject extends Subject { } public static class Step<TSubjectA extends Subject> { public void doWork(TSubjec
import java.util.List;
public class Test {
public static class Subject {
}
public static class MySubject extends Subject {
}
public static class Step<TSubjectA extends Subject> {
public void doWork(TSubjectA subject) {
}
}
public static class Worker {
public static <TSubjectB extends Subject> void doWork(TSubjectB subject, List<Step<? extends TSubjectB>> steps) {
for (Step<? extends TSubjectB> step : steps) {
step.doWork(subject);
}
}
}
public static void main(String[] args) {
MySubject subject;
List<Step<? extends Subject>> steps;
Worker.doWork(subject, steps);
}
}
import java.util.List;
公开课考试{
公共静态类科目{
}
公共静态类MySubject扩展了Subject{
}
公共静态类步骤{
公共无效道具(TSubjectA主题){
}
}
公共静态类工作者{
公共静态无效工作(TsObjectB subject,List虽然类型参数TsObjectA
和TsObjectB
都保证是某种类型扩展的subject
,但它们不一定是同一类型-一个可以是MySubject
,另一个可以是MyOtherSubject
。这就是当前代码不被考虑的原因编译器使用红色的typesafe
如果您需要的功能严格依赖于主题
基本实现,只需删除类型参数并依赖多态性即可:
public static class Step {
public void doWork(Subject subject) {
//do Subject stuff
}
}
public static class Worker {
public static void doWork(Subject subject, List<Step> steps) {
for (Step step : steps) {
step.doWork(subject);
}
}
}
public static void main(String[] args) {
List<Step> steps = ...;
//all valid
Worker.doWork(new Subject(), steps);
Worker.doWork(new MySubject(), steps);
Worker.doWork(new MyOtherSubject(), steps);
}
公共静态类步骤{
公共无效工作(主题){
//做主题的东西
}
}
公共静态类工作者{
公共静态无效工作(主题,列出步骤){
用于(步骤:步骤){
步骤.道具(受试者);
}
}
}
公共静态void main(字符串[]args){
列出步骤=。。。;
//全部有效
Worker.doWork(新主题(),步骤);
doWork(newmysubject(),步骤);
Worker.doWork(新MyOtherSubject(),步骤);
}
如果不是,也就是说如果doWork
实现因Subject
的子类型不同而不同,那么泛型对您没有帮助,您需要进行一些设计更改。请记住,Java中的泛型不是动态魔法,而是语法糖,可以帮助编译时类型安全。如果您没有l已经理解这个限制。虽然类型参数TSubjectA
和TSubjectB
都保证是某种类型扩展Subject
,但它们不一定是相同的类型-一个可以是MySubject
,另一个可以是MyOtherSubject
。这就是当前c编译器不认为ode是类型安全的
如果您需要的功能严格依赖于主题
基本实现,只需删除类型参数并依赖多态性即可:
public static class Step {
public void doWork(Subject subject) {
//do Subject stuff
}
}
public static class Worker {
public static void doWork(Subject subject, List<Step> steps) {
for (Step step : steps) {
step.doWork(subject);
}
}
}
public static void main(String[] args) {
List<Step> steps = ...;
//all valid
Worker.doWork(new Subject(), steps);
Worker.doWork(new MySubject(), steps);
Worker.doWork(new MyOtherSubject(), steps);
}
公共静态类步骤{
公共无效工作(主题){
//做主题的东西
}
}
公共静态类工作者{
公共静态无效工作(主题,列出步骤){
用于(步骤:步骤){
步骤.道具(受试者);
}
}
}
公共静态void main(字符串[]args){
列出步骤=。。。;
//全部有效
Worker.doWork(新主题(),步骤);
doWork(newmysubject(),步骤);
Worker.doWork(新MyOtherSubject(),步骤);
}
如果不是,也就是说如果doWork
实现因Subject
的子类型不同而不同,那么泛型对您没有帮助,您需要进行一些设计更改。请记住,Java中的泛型不是动态魔法,而是语法糖,可以帮助编译时类型安全。如果您没有我已经理解了这个限制