public interface MyInterface {
int MY_CONSTANT = 9;
} public interface MyInterface {
int doSomething1();
String doSomething2();
} public interface MyInterface {
class MyClass {
//...
}
interface MyOtherInterface {
//...
}
} public interface MyInterface {
enum MyEnum {
FOO, BAR;
}
@interface MyAnnotation {
//...
}
} interface Box<T> {
void insert(T item);
}
class ShoeBox implements Box<Shoe> {
public void insert(Shoe item) {
//...
}
} public interface MyInterface {
// Работает
static int foo() {
return 0;
}
// Не работает, поскольку у статических методов
// в интерфейсах должно быть тело
static int bar();
} MyInterface.staticMethod(); public interface MyInterface {
default int doSomething() {
return 0;
}
} interface A {
default int doSomething() {
return 0;
}
}
interface B {
default int doSomething() {
return 42;
}
}
class MyClass implements A, B {
} class MyClass implements A, B {
// Без этого метода будет ошибка компиляции
@Override
public int doSomething() {
return 256;
}
} public interface MyInterface {
private static int staticMethod() {
return 42;
}
private int nonStaticMethod() {
return 0;
}
} public interface UserRepository {
record UserInfo(String username, String email, int age) {}
UserInfo findUserById(int id);
List<UserInfo> findUsersByAge(int minAge, int maxAge);
} // Объявление sealed-интерфейса
public sealed interface Shape
permits Circle, Triangle {
double area();
double perimeter();
// Метод по умолчанию, использующий преимущества sealed-иерархии
default boolean isPolygonal() {
return this instanceof Triangle;
}
} // Реализация интерфейса
final class Circle implements Shape {
private final double radius;
public Circle(double radius) {
this.radius = radius;
}
public double getRadius() {
return radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
@Override
public double perimeter() {
return 2 * Math.PI * radius;
}
} // Реализация интерфейса
non-sealed class Triangle implements Shape {
private final double sideA;
private final double sideB;
private final double sideC;
public Triangle(double sideA, double sideB, double sideC) {
this.sideA = sideA;
this.sideB = sideB;
this.sideC = sideC;
}
public double getSideA() {
return sideA;
}
public double getSideB() {
return sideB;
}
public double getSideC() {
return sideC;
}
@Override
public double area() {
double semiPerimeter = perimeter() / 2;
return Math.sqrt(semiPerimeter *
(semiPerimeter - sideA) *
(semiPerimeter - sideB) *
(semiPerimeter - sideC));
}
@Override
public double perimeter() {
return sideA + sideB + sideC;
}
} public class ShapeProcessor {
public static String describeShape(Shape shape) {
return switch (shape) {
case Circle c ->
String.format("Круг с радиусом %.1f (площадь: %.2f)",
c.getRadius(), c.area());
case Triangle t ->
String.format("Треугольник со сторонами %.1f, %.1f, %.1f (площадь: %.2f)",
t.getSideA(), t.getSideB(), t.getSideC(), t.area());
};
}
} @FunctionalInterface
public interface Validator<T> {
boolean isValid(T value);
default Validator<T> and(Validator<T> other) {
return value -> this.isValid(value) && other.isValid(value);
}
default Validator<T> or(Validator<T> other) {
return value -> this.isValid(value) || other.isValid(value);
}
static <T> Validator<T> alwaysValid() {
return value -> true;
}
}