CharSequence
- interface
. Поэтому, даже если SomeClass
не реализует CharSequence
, было бы вполне возможно создать класс
class SubClass extends SomeClass implements CharSequence
. Поэтому вы можете написать
SomeClass c = getCharSequence();
, потому что предполагаемый тип X
является типом пересечения SomeClass & CharSequence
.
Это немного странно в случае Integer
, потому что Integer
является окончательным, но final
не играет никакой роли в этих правилах. Например, вы можете написать
. С другой стороны, String
не является interface
, поэтому было бы невозможно расширить SomeClass
, чтобы получить подтип String
, потому что java не поддерживает множественное наследование для классов.
С примером List
вам нужно помнить, что дженерики не являются ни ковариантными, ни контравариантными. Это означает, что если X
является подтипом Y
, List
не является ни подтипом, ни супертипом List
. Поскольку Integer
не реализует CharSequence
, вы не можете использовать List
в своем методе doCharSequence
.
Вы можете, однако, получить это, чтобы скомпилировать
void foo(List list) {
doCharSequence(list);
}
Если у вас есть метод, который возвращает a List
следующим образом:
static List foo()
вы можете сделать
List extends Integer> list = foo();
Опять же, это потому, что выведенные type Integer & CharSequence
, и это подтип Integer
.
Типы пересечений возникают неявно, когда вы указываете несколько границ (например,
).
Для получения дополнительной информации здесь является частью JLS, где объясняется, как работают ограничения типов. Вы можете включить несколько интерфейсов, например
, но только первая оценка может быть неинтерфейсом.
i1/i2
будет равно 0. Так как i1
и i2
являются целыми числами.
Если у вас есть int1/int2
, если ответ не является идеальным целым числом, цифры после десятичной точки будут удалены. В вашем случае 2/5
равно 0,4, поэтому вы получите 0.
Вы можете использовать i1
или i2
для double
(другое будет неявно преобразовано)
double d = 3 + (double)i1/i2 +2;
int i1 =2;
int i2=5;
double d = 3 + (double)i1/(double)i2 +2;
, если i1 / i2 будет дробным, тогда double поможет ему быть во фракции вместо int. так что теперь вы получите результат по своему усмотрению. или вы также можете использовать следующий код double d = 3+ (double) i1 / i2 + 2; В этой строке i1 преобразуется в double, который будет разделен на i2, и результат будет в два раза, поэтому результат будет равен 5.4
Эта ссылка содержит информацию о преобразовании типа данных, как неявного, так и явного типа.
Для точного ответа на вопрос будет:
double d = 3 + (double)i1/i2 + 2
i1/i2
будет 0, потому что оба i1
и 12
являются целыми числами.
, если вы добавили i1
или i2
в double
, тогда он даст желаемый результат.
double d = 3 + (double)i1/i2 +2;
Поскольку i1 = 2 и i2 = 5 являются целыми типами, и когда вы делите (2/5) их, оно дает целочисленное значение (0), потому что дробная часть (.4) отбрасывается. Итак, положим (double) i1 / i2 на уравнение.
Эта строка выполняется по частям:
double d = 3 + i1/i2 +2;
double d = 3 + (i1/i2) +2;
double d = 3 + ((int)2/(int)3) +2;
double d = 3 + ((int)0) +2;
double d = (int)5;
double d = 5;
Двойной просто означает, что ответ будет передан в double, он не будет иметь никакого эффекта до вычисления ответа. Вы должны написать
double d = 3d + (double)i1/i2 +2d; //having one double in each "part" of the calculation will force it to use double maths, 3d and 2d are optional
i1/i2
при преобразовании в int дает 0. ie. почему вы получаете 5.0. Попробуйте следующее:
public static void main(String args[])
{
int i1 =2;
int i2=5;
double d = 3 + (double)i1/(double)i2 +2;
System.out.println(d);
}