Java多接口和反射

时间:2016-01-11 19:41:27

标签: java reflection interface

我有一个名为X的类,它实现了多个(例如3个)接口,称之为A,B和C.

我创建另一个扩展接口A和B的接口AB。

如何使用反射创建可分配给接口AB的X实例?

我不断使用此代码获取ClassCast异常:

package test.messages;

public interface A
{
    void methodA();
}

package test.messages;

public interface B
{
    void methodB();
}

package test.messages;

public interface C
{
    void methodC();
}

package test.messages;

public interface AB extends A, B
{

}

package test.messages;

public class X implements A, B, C
{
    @Override
    public void methodC()
    {
        System.out.println("C");
    }

    @Override
    public void methodB()
    {
        System.out.println("B");
    }

    @Override
    public void methodA()
    {
        System.out.println("A");
    }
}

然后是一个完全不同的课程:

AB api = (AB)Class.forName("test.messages.X").newInstance();

System.out.println(api);

现在,当我尝试使用一个界面时,说A,它可以正常工作。

无论如何都要使用组合接口AB吗?

3 个答案:

答案 0 :(得分:2)

是-a 关系不起作用。 AB实施AB以及X实施AB这一事实并未使X分配给AB {1}}。

即使您认为AB与实现AB的任何类型兼容,但AB不是AB的类型和层次结构树在Java中修复了类本身的定义。

考虑Liskov substitution principle:如果您向X添加方法,则AB不再是有效候选者,因为它不包含org.postgresql.util.PSQLException: The connection attempt failed. at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:257) at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:65) at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:159) at org.postgresql.Driver.makeConnection(Driver.java:415) at org.postgresql.Driver.connect(Driver.java:283) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at com.javacodegeeks.examples.TestConnection.main(TestConnection.java:16) Caused by: java.io.IOException: Illegal UTF-8 sequence: initial byte is 11111xxx: 252 at org.postgresql.core.UTF8Encoding.decode(UTF8Encoding.java:125) at org.postgresql.core.PGStream.ReceiveString(PGStream.java:329) at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:424) at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:203) ... 7 more 中声明的方法

您需要一种支持structural type system的编程语言。

答案 1 :(得分:1)

你不能这样做,因为在继承树X中没有实现AB。 如果A,B,C都是接口,解决问题的一个简单方法就是说X实现了AB,C,这意味着它可以被转换为A,B,C和AB。

答案 2 :(得分:1)

你真正想要的是 AND type - muty( muty.options, el, records => console.log( records ) )。 Java中通常不支持此操作。但是,我们可以创建一个包装类,它包含一个类型为A和类型B的值。(看起来每个问题都可以通过包装器解决:)

A&B

我们不需要使用public class AB<T extends A&B> { public final T v; ... v = (T)Class.forName("test.messages.X").newInstance(); } 类型,而是在需要的任何地方使用A&B。我们将对其AB<?>字段v进行操作,AB

void foo(AB<?> ab)
{
    ab.v.methodOfA();
    ab.v.methodOfB();
}

或者你也可以使AB成为A和B的子类型。

public class AB<T extends A&B> implements A, B
{
    public final T v;

    @Override // A
    public int methodOfA(){ return v.methodOfA(); }

https://stackoverflow.com/a/32659085/2158288

了解详情