Quantas superinterfaces diretas uma classe pode ter em Java?

Quantos implements podemos fazer em uma classe, isto é, o limite de implements por classe.

Acredito que o limite seja 255 interfaces.

Só pra esclarecer, a palavra chave implements só pode aparecer uma vez na declaração de uma classe.

Uma classe pode implementar mais de uma interface, neste caso usamos virgula para separar o nome de cada interface implementada.

interface A {}

interface B {}

interface C {}

class X implements A, B, C {}

No caso acima dizemos que as interfaces A, B e C são superinterfaces diretas da classe X.

Segundo a especificação da JVM, uma classe ou interface pode ter, no máximo, 65535 superinterfaces diretas.

• The number of direct superinterfaces of a class or interface is limited to 65535 by the size of the interfaces_count item of the ClassFile structure (§4.1).

Esta limitação acontece porque o campo interface_count do arquivo class é do tipo u2, ou seja, um inteiro sem sinal de 2 bytes.

No link abaixo vc pode ver as outras limitações:

https://docs.oracle.com/javase/specs/jvms/se15/html/jvms-4.html#jvms-4.11

2 curtidas

:heart:
Classes aninhadas eu sei que só dá pra aninhar em 255 níveis.
Já fiz isso.
:see_no_evil:

Pelo que vi parece não haver um limite para classes aninhadas, só que na prática o file system pode impor limites. Considere o seguinte código:

public class Test1 {
  class aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa {
    class bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {
      class cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc {
        class dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd {
        }
      }
    }
  }
}

Ao compilar a classe mais interna se tornará um arquivo com o seguinte nome:

Test1$aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb$cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc$dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd.class

Este nome tem exatamente 255 caracteres contando com a extensão, que, segundo a Wikipedia é o máximo permitido para ext4 que é o que eu uso no meu sistema.

Se eu acrescentar um único caractere ao nome de qualquer uma das classes, tipo assim:

public class Test1 {
  class Zaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa {
    class bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb {
      class cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc {
        class dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd {
        }
      }
    }
  }
}

O compilador vai gerar o seguinte erro:

O máximo que eu consegui aninhar antes de receber o erro acima foram 99 classes sendo que o nome de todas tem somente um caractere.

public class A { // @formatter:off
class B { class C { class D { class E { class F { class G { class H { class I { class J { class K {
class L { class M { class N { class O { class P { class Q { class R { class S { class T { class U {
class V { class W { class X { class Y { class Z { class a { class b { class c { class d { class e {
class f { class g { class h { class i { class j { class k { class l { class m { class n { class o {
class p { class q { class r { class s { class t { class u { class v { class w { class x { class y {
class z { class À { class Î { class Í { class Ï { class Ð { class Ñ { class Ò { class Ó { class Ô {
class Õ { class Ö { class Ø { class Ù { class Ú { class Û { class Ü { class Á { class  { class à {
class Ä { class Å { class Æ { class Ç { class È { class É { class Ê { class Ë { class Ì { class Ý {
class Þ { class ß { class à { class á { class â { class ã { class ä { class å { class æ { class ç {
class è { class é { class ê { class ë { class ì { class í { class î { class ï { class ð {
} } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } }
} } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } }