【问题标题】:Can I create object with implicit parameter in java, as in c++?我可以像在 c++ 中一样在 java 中创建带有隐式参数的对象吗?
【发布时间】:2020-12-04 21:39:38
【问题描述】:

我可以通过隐式分配char数组在java中创建字符串

String s = "asd";

而不是

String s = new String("asd");

这种行为类似于带有隐式单参数构造函数的 c++。

那为什么不能用另一个用户定义的类呢?

public class Foo {
    public Foo(int i) {
        System.out.println(i);
    }
}

public class Main {
    public static void main(String[] args) {
        Foo f = 9;
    }
}

给予

Type mismatch: cannot convert from int to Foo

那么为什么来自 java API 的一些“高级”类可以具有这种从赋值构造隐含的行为,而自定义的用户定义类却不能呢?

【问题讨论】:

  • fwiw,这行中发生的事情与 C++ 中具有相似语法的行中发生的事情完全不同。它们看起来很相似,但这是由于语法相似,否则 C++ 和 Java 非常不同
  • @OP -- C++ 不是 Java,Java 不是 C++。它们是两种不同的语言。
  • @PaulMcKenzie 但是阅读这个问题可以清楚地表明,OP 不会以任何方式对此感到困惑。因此,尽管您的陈述是正确的,但我不确定它的用途是什么。提及语言之间的相似性并没有错。
  • 您的问题不是关于相似之处,但是当您说“此行为类似于 c++ ...”时,您的问题有一个错误的前提,您可以在不实质性改变问题的情况下删除该错误前提,然后您也可以去掉 C++ 标签。您错误地假设它们相似,但实际上这些都与 C++ 无关;)
  • @PaulMcKenzie 如果你问这个问题,你可以这样做。我不清楚你为什么坚持让 OP 这样做。

标签: java c++ string constructor implicit-conversion


【解决方案1】:

Java 中没有隐式构造函数。用双引号括起来的一系列字符是string literal。正如您所怀疑的,这个定义是语言本身的一部分,在 Java 中无法为您自己的类型创建文字。

【讨论】:

  • String s = "asd" 是隐式转换,你想说什么就说什么。否则,该 String 对象的构造函数在哪里?为 String 构造函数指定的参数在哪里?论点是在赋值方面,这正是“隐含”的意思
  • 不,绝对不是。右手边是一个字符串文字,如语言定义中所指定。请注意,作为一个成熟的 String 对象,您可以执行 "asd".startsWith("a") 之类的操作
  • 重要的是,String 和对它的支持是语言中独一无二的内置方式,这是任何其他类型都无法使用的。
  • @LouisWasserman 对,所以您只需确认我所说的话。它们是 优于 用户定义类的 java API 类。因为它们处理了“普通”用户无法实现的功能。这就是 Java 让它如此壮丽的原因吗?
  • 这做出了我认为不合适的价值判断。这只是语言做出的设计选择,有利有弊。
【解决方案2】:

首先,你误会了:"asd"不是char数组,是字符串字面量,当然和new String("asd")不一样。

与其他一些编程语言不同,Java 是非常静态的,不支持扩展语言本身,例如不支持运算符重载隐式构造等功能。

Java 语言有一组内置数据类型记录在 Chapter 4. Types, Values, and Variables 中:String 和所有 primitive typesbooleanbyteshortintlongcharfloatdouble)。 Chapter 5. Conversions and Contexts 涵盖了这些类型之间的转换。

一些 Java 类型,主要是 java.lang 包中的类型,是 Java 语言 的一部分。它们具有非常特殊的含义,在Java Language Specification 中明确记录,并且不被视为“优越”,而只是该语言的“原生”。以下是一些示例:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2023-04-03
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多