(Тип) String.class подтип (тип) Object.class?

Пустая строка - это уникальная строка нулевой длины.
Пустая строка является элементом идентификации операции конкатенации.
Пустая строка предшествует любой другой строке в лексикографическом порядке, поскольку она является самой короткой из всех строк.
Пустая строка является допустимой строкой, с которой должно работать большинство строковых операций.
Википедия

 > strlen("");
=> 0
 > "a" . "" == "a";
=> true
 > "" . "a" == "a";
=> true   
 > "" < "\0";
=> true   

Сверху кажется, что PHP рассматривает пустую строку как допустимую строку.

> strstr("lolsome", "");
strstr(): Empty needle :1

Но кажется, что пустая строка не считается полностью допустимой. Скорее всего, PHP является единственным языком, который не позволяет искать подстроку в строке как пустую строку.

Это защитный механизм? Очевидно, программисты не должны защищать иглу с помощью if. Если так, то почему другие языки позволяют пройти этот тест !!! Разработчики языка должны ответить

Из чего состоит строка Python?

>>> ''.count('')
1

Очевидно, пустая строка имеет одну пустую строку.

>>> 'a'.count('')
2

Одна строка элементов имеет две пустые строки.

>>> 'ab'.count('')
3

Так что, похоже, строка Python является конкатенацией строк из одного элемента. Каждый элемент в строке помещается между двумя пустыми строками.

>>> "lolsome".split('')
Traceback (most recent call last):
  File "", line 1, in 
ValueError: empty separator

Но здесь Python противоречит действительности пустой строки. Это ошибка?
Ruby и JavaScript проходят здесь тест.

 > "lolsome".split("")
=> ["l", "o", "l", "s", "o", "m", "e"]

Я собрал несколько языковых примеров из кода Розетты , интересно отметить, что все они допускают пустую строку в поиск подстроки и возврат истины.

AWK

awk 'BEGIN { print index("lolsome", "") != 0 }'

C

int main() {
    printf("%d\n", strstr("lolsome", "") != NULL);
    return 0;
}

C ++

#include 
#include 

int main() {
    std::string s = "lolsome";
    std::cout << (s.find("") != -1) << "\n";
    return 0;
}

C #

using System;
class MainClass {
  public static void Main (string[] args) {
    string s = "lolsome";
    Console.WriteLine(s.IndexOf("", 0, s.Length) != -1);
  }
}

Clojure

(println (.indexOf "lolsome" ""))

Go

package main

import (
    "fmt"
    "strings"
)
func main() {
    fmt.Println(strings.Index("lolsome", "") != -1)
}

Groovy

println 'lolsome'.indexOf('')

возвращает 0, при ошибке возвращает -1

Java

class Main {
  public static void main(String[] args) {
    System.out.println("lolsome".indexOf("") != -1);
  }
}

JavaScript

"lolsome".indexOf("") != -1

Lua

s = "lolsome"
print(s:find "" ~= nil)

Perl

print index("lolsome", "") != -1;

Python

[1167]

"lolsome".find("") != -1

Рубин

"lolsome".index("") != nil
5
задан Hanno Fietz 22 May 2009 в 11:00
поделиться

7 ответов

Свойство .class всегда возвращает объект Class . Класс Класс (странный) имеет общий параметр. Типы общих параметров являются подклассами.

Class<String> stringClass = String.class;
Class<Object> objectClass = Object.class;

И поскольку с универсальными типами Тип не является НЕ супертипом Типа (см. ] учебные пособия по Java ), это означает, что ответ - «Нет».

8
ответ дан 18 December 2019 в 13:18
поделиться

Объекты класса в Java - все объекты одного класса.

Вы можете сказать, потому что если вы посмотрите на в Javadoc вы можете видеть, что класс Class является final .

4
ответ дан 18 December 2019 в 13:18
поделиться

попробуйте этот код:

boolean answer = Object.class.isAssignableFrom(String.class);
System.out.println(answer); // true!

однако:

Class<Object> string = String.class; <-- compile-time error
Class<? extends Object> string = String.class; <-- it's ok 
1
ответ дан 18 December 2019 в 13:18
поделиться

Нет, существует только один класс с именем Class . String.class является экземпляром Class, а также Object.class.

1
ответ дан 18 December 2019 в 13:18
поделиться

Причина, по которой Class не расширяет Class, даже если Y расширяет X, заключается в том, что для любого универсального типа G G не расширяет G

Вы можете найти это в FAQ и т. Д. A мешок яблок - это не мешок фруктов, даже если яблоко - это фрукт; потому что к последним можно добавлять любые фрукты, а к первым - только яблоки.

0
ответ дан 18 December 2019 в 13:18
поделиться

Если я правильно понимаю ваш вопрос, это не так. Объект, представляющий класс java.lang.String , как и любой другой класс, всегда относится к классу java.lang.Class .

Имейте в виду, что java.lang.Class определен как final , поэтому вы не можете создать подкласс it.

0
ответ дан 18 December 2019 в 13:18
поделиться

Все объекты класса являются экземплярами класса.

Если вы хотите узнать иерархию класса, вы можете вызвать getSuperClass () и getInterfaces ()

Примечание: вы можете необходимо вызвать их рекурсивно, чтобы получить все суперклассы и интерфейсы.

0
ответ дан 18 December 2019 в 13:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: