我有一个名为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吗?
答案 0 :(得分:2)
是-a 关系不起作用。 AB
实施A
和B
以及X
实施A
和B
这一事实并未使X
分配给AB
{1}}。
即使您认为AB
与实现A
和B
的任何类型兼容,但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
进行操作,A
和B
。
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(); }
了解详情