Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
? extends tsobject extends Subject-不是类型安全的,或者只是Java可以';你不能处理它吗?_Java_Generics - Fatal编程技术网

? 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中的泛型不是动态魔法,而是语法糖,可以帮助编译时类型安全。如果您没有我已经理解了这个限制