Метод решения ошибки: «не может создать экземпляр абстрактного класса»

== тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).

.equals() тесты для равенства значений (независимо от того, являются ли они логически «равными»).

Objects.equals () проверяет наличие null перед вызовом .equals(), поэтому вам не нужно (доступно с JDK7, также доступным в Guava ).

String.contentEquals () сравнивает содержимое String с содержимым любого CharSequence (доступно с Java 1.5).

Следовательно, если вы хотите проверить, имеет ли две строки одно и то же значение, вы, вероятно, захотите использовать Objects.equals().

// These two have the same value
new String("test").equals("test") // --> true 

// ... but they are not the same object
new String("test") == "test" // --> false 

// ... neither are these
new String("test") == new String("test") // --> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" // --> true 

// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true

// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true

Вы почти всегда хотите использовать Objects.equals(). В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать ==.

Из JLS 3.10. 5. Строковые литералы :

Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса String. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя метод String.intern.

blockquote>

. Подобные примеры также можно найти в JLS 3.10.5-1 .

13
задан max 9 November 2009 в 05:23
поделиться

2 ответа

не может создать экземпляр абстрактного класса

Основываясь на этой ошибке, я предполагаю, что вы используете Visual Studio (поскольку именно так говорит Visual C ++, когда вы пытаетесь создать экземпляр абстрактного класса).

Посмотрите на окно вывода Visual Studio (Вид => Вывод); выходные данные должны включать утверждение после ошибки:

stubby.cpp(10) : error C2259: 'bar' : cannot instantiate abstract class
due to following members:
'void foo::x(void) const' : is abstract
stubby.cpp(2) : see declaration of 'foo::x'

(Это ошибка, приведенная для примера кода bdonlan)

В Visual Studio в окне «Список ошибок» отображается только первая строка сообщения об ошибке.

45
ответ дан 1 December 2019 в 17:36
поделиться

C ++ сообщает вам, какие именно функции являются абстрактными и где они объявлены:

class foo {
        virtual void x() const = 0;
};

class bar : public foo {
        virtual void x() { }
};

void test() {
        new bar;
}

test.cpp: In function ‘void test()’:
test.cpp:10: error: cannot allocate an object of abstract type ‘bar’
test.cpp:5: note:   because the following virtual functions are pure within ‘bar’:
test.cpp:2: note:       virtual void foo::x() const

Так что, возможно, попробуйте скомпилировать свой код с помощью C ++ или указать свой компилятор, чтобы другие могли дать полезные предложения для вашего конкретного компилятор.


6
ответ дан 1 December 2019 в 17:36
поделиться
Другие вопросы по тегам:

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