我们能否编写自定义标记接口?

7

我希望能够像java.io.SerializableCloneable一样编写自己的标记接口,并让JVM能够理解。请建议我实现过程。

例如,我实现了一个名为NotInheritable的接口,所有实现该接口的类都必须避免继承。


3
“understandable to JVM” 是什么意思? - Damian Leszczyński - Vash
不过,JVM支持使用http://docs.oracle.com/javase/tutorial/java/IandI/final.html将类标记为“不可继承”。 - OrangeDog
答案是否定的。如果你想创建任何标记“重要接口”,那么不行。但是,如果你只是想创建一个标记接口来检查类对象是否是该标记接口的对象,那么是可以的。要创建“可被JVM理解”的标记接口,需要对JVM进行定制,我不确定是否可以实现。 - iprashant
5个回答

3
public interface MyMarkerInterface {}

public class MyMarkedClass implements MyMarkerInterface {}

然后你可以有一个只接受MyMarkerInterface实例的方法:

public myMethod(MyMarkerInterface x) {}

或者在运行时使用instanceof进行检查。


2
是的,我们可以编写自己的标记异常...请参考以下示例....
interface Marker{   
}

class MyException extends Exception {   

    public MyException(String s){
        super(s);
    }
}

class A implements Marker {

   void m1() throws MyException{        
     if((this instanceof Marker)){
         System.out.println("successfull");
     }
     else {
         throw new MyException("Unsuccessful  class must implement interface Marker ");
     }      
}   
}

/* Class B has not implemented Maker interface .
 * will not work & print unsuccessful Must implement interface Marker
*/
class B extends A  {    


}

// Class C has not implemented Maker interface . Will work & print successful

public class C  extends A implements Marker   
 { // if this class will not implement Marker, throw exception
     public static void main(String[] args)  {
     C a= new C();
     B b = new B();

     try {
        a.m1(); // Calling m1() and will print
        b.m1();
     } catch (MyException e) {

        System.out.println(e);
    }

}
}

OUTOPUT


1
这个例子似乎完全没有意义。为什么不直接让类Aa实现标记接口呢? - user207421

1
假设只有在标记了 MyInterface 的地方才应调用 myMethod。
interface MyInterface{}

class MyException extends RuntimeException{

    public MyException(){}
    public MyException(String message){
        super(message);
    }
}

class MyClass implements MyInterface{
    public void myMethod(){
        if(!(this instanceOf MyInterface)){
            throw new MyException();
        }else{
            // DO YOUR WORK
        }
    }
}

0

你可以编写自己的标记接口,JVM 对此一无所知。

您必须使用 instanceof 来提供功能。点击查看此链接


-3
一个标记接口是一个空接口。这意味着你只需要创建一个接口,而不需要在其中创建任何方法。更好的解释可以在这里找到。
这种方法可以用具有类似类型功能的注释来替代。更多

制造者仍然具有其重要性。 - Simmant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接