Java 总有一天JVM会出现吗;“仅限作废退货类型”;成为自我呼叫链接的新功能?

Java 总有一天JVM会出现吗;“仅限作废退货类型”;成为自我呼叫链接的新功能?,java,jvm,Java,Jvm,有一天JVM“void return type only”会成为一种自我调用链接的新功能吗? 1)这意味着允许返回任何东西:但可能并不像评论员所说的那样好 若否,原因为何?为什么这是一个很好的理由,永远不允许下面 class A{ // public Object a(){return null;} public void a(){} } class B extends A{ @Override public String a(){return "";}; //error

有一天JVM“void return type only”会成为一种自我调用链接的新功能吗?

1)这意味着允许返回任何东西:但可能并不像评论员所说的那样好

若否,原因为何?为什么这是一个很好的理由,永远不允许下面

class A{
//    public Object a(){return null;}
  public void a(){}
}
class B extends A{
  @Override
    public String a(){return "";}; //error
}
2)这是关于自我呼叫链接,限制使用,将是更好/更安全/更清晰的选择

我为什么要那样?让setter链式链接如下:
new B().set1(1)、set2(2)、set3(3)使用

无效返回是如此无用,它不会破坏任何东西,因为它已经被所有东西忽略了

由于我们无法访问大多数图书馆的设置者,也不想把他们都交出来,所以我想真正的交易应该是让void(或void?)成为对象甚至更好,成为一个名为“?扩展Self”的新限制类型,让getThis()技巧成为JVM核心的一部分。。所以这将是一个受限的用例,仅限于自链接调用

为什么高级语言(然后是汇编语言)不能允许这种协方差“违法”功能/选项?如果我们调用一个返回某个内容的方法并忽略/不捕获它,那么它的工作方式将等同于一个void返回! 因此,可以允许使用其他返回功能为曾经只有沙漠般的选项的地方带来新的曙光

所以,这是真正的交易,一个二传手返回无效将使我们没有选择:

class A<SELF extends A>{
//  public void set(){} //this one leaves us no options
  public SELF set(){return getThis();}
    public SELF getThis(){return (SELF)this;}
}
class B extends A<B>{
  @Override public B set(){return getThis();}
  @Override public B getThis(){return this;}
}
A类{
//public void set(){}//这一个让我们别无选择
公共自集(){return getThis();}
public SELF getThis(){return(SELF)this;}
}
B类扩展了A类{
@重写公共B集(){return getThis();}
@重写公共B getThis(){返回此;}
}
基本上,我不是在寻找意见,我是在寻找一个好的理由/解释

因此,我知道我在进一步论证这个问题的要求:

Java确实支持协变返回类型。例如:

class A {
    Object run() { ... }
}

class B {
    String run() {...}
}

因此,您的链式设置器示例可以使用覆盖(或泛型)。但是,生成的代码可能感觉不像惯用Java

因为继承的基本规律。具体而言,固体中的Liskov替换原理:
“程序中的对象应可替换为其子类型的实例,而不会改变该程序的正确性。”

通过更改返回类型,子类将不遵循此原则。调用
b.a()
不会返回void,而是返回一个字符串

我想不出在返回void并随后被重写以返回其他内容的方法的特定情况下有什么具体问题,但这是一个非常奇怪的情况,我担心人们会滥用它,并且我的扩展了A的类d在d.A()上返回一个int,现在每个人都感到困惑

因为当我告诉我的程序员同事我正在调用a的某个子类的方法a(),他们知道它将返回什么。

class A{ 
//    public Object a(){return null;} 
  public void a(){} 
} 
class B extends A{ 
  @Override 
    public String a(){return "";}; //error
} 
class C extends A{
  @Override 
    public int a(){return 0;}; //error
}
现在方法a()做什么?我如何以明智的方式与团队沟通这种方法

现在想象一下我有这个:

List<A> listOfAs = new ArrayList<>();
List listOfAs=new ArrayList();

当我调用
listOfAs.get(0.a()/2

时会发生什么情况?

从根本上改变语言的语义或放松软件几十年来一直依赖的语义规则从来都不是一个好理由。继续提出,但你会得到同样的答案。这个想法对我来说很有意义,但它并不能改变这是一个基于观点的问题的事实。为什么我现在不应该向JVM开发人员建议——没有人说你不应该,但不要期望任何结果……重复:@shmosel是的,我读到了,主要论点是“因为JLS这么说”,这对我来说不是一个论点,从某种意义上说,与汇编程序相比,我们使用的是高级语言……正如@shmosel所说,
void
的协方差不会产生任何技术问题。设置者的链接也不会在语言级别处理。这甚至不需要任何JVM更改。虽然我更喜欢像
那样使用(new B()){set1(1);set2(2);set3(3);}
,因为它甚至可以用于非
void
方法,并支持方法调用的简单线性链之外的其他语言构造。这不是真的。
A.A()
的调用方不需要返回类型,也不违反任何期望。根据你的逻辑,任何协变返回类型都会违反LSP。@shmosel,我已经编辑了我的答案,我想你可能会觉得它值得重新考虑。我读了你的编辑,重新考虑,但没有看到你的论点有任何优点。我想他们会感到惊讶,不会因为事情没有改变而感到困惑,从某种意义上说,现在有了,现在又有了,但从某种意义上说,沙漠里什么都没有,现在有了一个可以喝酒休息的地方,一片绿洲:)你用非常模糊的术语来表达你的观点:现在方法a()做了什么?调用listOfAs.a().get(0)/2
时会发生什么?该方法所做的是实现中的任何内容。当您尝试从
void
方法获取返回值时会发生什么情况?显然,它没有编译。另外,我想你的意思是
listOfAs.get(0).a()
。这不是一个真正的答案,只是一个难看的解决办法。我无法访问大多数库的setter,我不会放弃它们,我想真正的交易是让void成为对象。@AquariusPower我同意。您将需要超类中的非void、非final方法。。。而那些愿意超越它们的人:)