gpt4 book ai didi

Java不接受同名的2个方法

转载 作者:太空宇宙 更新时间:2023-11-03 12:55:06 25 4
gpt4 key购买 nike

我需要运行下面显示的代码(获取自:Which Cipher Suites to enable for SSL Socket?)。

问题是代码包含几个名为:createSocket 的方法,参数类型不同。 eclipse 告诉我错误说: enter image description here

我读到 Java 可以有多个同名方法,只要参数不同(方法重载)。我不知道为什么这会给我带来问题?

代码是:

class SSLSocketFactoryEx extends SSLSocketFactory
{
public SSLSocketFactoryEx() throws NoSuchAlgorithmException, KeyManagementException
{
initSSLSocketFactoryEx(null,null,null);
}

public SSLSocketFactoryEx(KeyManager[] km, TrustManager[] tm, SecureRandom random) throws NoSuchAlgorithmException, KeyManagementException
{
initSSLSocketFactoryEx(km, tm, random);
}

public SSLSocketFactoryEx(SSLContext ctx) throws NoSuchAlgorithmException, KeyManagementException
{
initSSLSocketFactoryEx(ctx);
}

public String[] getDefaultCipherSuites()
{
return m_ciphers;
}

public String[] getSupportedCipherSuites()
{
return m_ciphers;
}

public String[] getDefaultProtocols()
{
return m_protocols;
}

public String[] getSupportedProtocols()
{
return m_protocols;
}

public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException
{
SSLSocketFactory factory = m_ctx.getSocketFactory();
SSLSocket ss = (SSLSocket)factory.createSocket(s, host, port, autoClose);

ss.setEnabledProtocols(m_protocols);
ss.setEnabledCipherSuites(m_ciphers);

return ss;
}

public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException
{
SSLSocketFactory factory = m_ctx.getSocketFactory();
SSLSocket ss = (SSLSocket)factory.createSocket(address, port, localAddress, localPort);

ss.setEnabledProtocols(m_protocols);
ss.setEnabledCipherSuites(m_ciphers);

return ss;
}

public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException
{
SSLSocketFactory factory = m_ctx.getSocketFactory();
SSLSocket ss = (SSLSocket)factory.createSocket(host, port, localHost, localPort);

ss.setEnabledProtocols(m_protocols);
ss.setEnabledCipherSuites(m_ciphers);

return ss;
}

public Socket createSocket(InetAddress host, int port) throws IOException
{
SSLSocketFactory factory = m_ctx.getSocketFactory();
SSLSocket ss = (SSLSocket)factory.createSocket(host, port);

ss.setEnabledProtocols(m_protocols);
ss.setEnabledCipherSuites(m_ciphers);

return ss;
}

public Socket createSocket(String host, int port) throws IOException
{
SSLSocketFactory factory = m_ctx.getSocketFactory();
SSLSocket ss = (SSLSocket)factory.createSocket(host, port);

ss.setEnabledProtocols(m_protocols);
ss.setEnabledCipherSuites(m_ciphers);

return ss;
}

private void initSSLSocketFactoryEx(KeyManager[] km, TrustManager[] tm, SecureRandom random)
throws NoSuchAlgorithmException, KeyManagementException
{
m_ctx = SSLContext.getInstance("TLS");
m_ctx.init(km, tm, random);

m_protocols = GetProtocolList();
m_ciphers = GetCipherList();
}

private void initSSLSocketFactoryEx(SSLContext ctx)
throws NoSuchAlgorithmException, KeyManagementException
{
m_ctx = ctx;

m_protocols = GetProtocolList();
m_ciphers = GetCipherList();
}

protected String[] GetProtocolList()
{
String[] preferredProtocols = { "TLSv1", "TLSv1.1", "TLSv1.2", "TLSv1.3" };
String[] availableProtocols = null;

SSLSocket socket = null;

try
{
SSLSocketFactory factory = m_ctx.getSocketFactory();
socket = (SSLSocket)factory.createSocket();

availableProtocols = socket.getSupportedProtocols();
Arrays.sort(availableProtocols);
}
catch(Exception e)
{
return new String[]{ "TLSv1" };
}
finally
{
if(socket != null)
socket.close();
}

List<String> aa = new ArrayList<String>();
for(int i = 0; i < preferredProtocols.length; i++)
{
int idx = Arrays.binarySearch(availableProtocols, preferredProtocols[i]);
if(idx >= 0)
aa.add(preferredProtocols[i]);
}

return aa.toArray(new String[0]);
}

protected String[] GetCipherList()
{
String[] preferredCiphers = {

// *_CHACHA20_POLY1305 are 3x to 4x faster than existing cipher suites.
// http://googleonlinesecurity.blogspot.com/2014/04/speeding-up-and-strengthening-https.html
// Use them if available. Normative names can be found at (TLS spec depends on IPSec spec):
// http://tools.ietf.org/html/draft-nir-ipsecme-chacha20-poly1305-01
// http://tools.ietf.org/html/draft-mavrogiannopoulos-chacha-tls-02
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
"TLS_ECDHE_ECDSA_WITH_CHACHA20_SHA",
"TLS_ECDHE_RSA_WITH_CHACHA20_SHA",

"TLS_DHE_RSA_WITH_CHACHA20_POLY1305",
"TLS_RSA_WITH_CHACHA20_POLY1305",
"TLS_DHE_RSA_WITH_CHACHA20_SHA",
"TLS_RSA_WITH_CHACHA20_SHA",

// Done with bleeding edge, back to TLS v1.2 and below
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",

"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_DHE_DSS_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_DHE_DSS_WITH_AES_128_GCM_SHA256",

// TLS v1.0 (with some SSLv3 interop)
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA384",
"TLS_DHE_DSS_WITH_AES_256_CBC_SHA256",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA",

"TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
"TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA",
"SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA",
"SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA",

// RSA key transport sucks, but they are needed as a fallback.
// For example, microsoft.com fails under all versions of TLS
// if they are not included. If only TLS 1.0 is available at
// the client, then google.com will fail too. TLS v1.3 is
// trying to deprecate them, so it will be interesteng to see
// what happens.
"TLS_RSA_WITH_AES_256_CBC_SHA256",
"TLS_RSA_WITH_AES_256_CBC_SHA",
"TLS_RSA_WITH_AES_128_CBC_SHA256",
"TLS_RSA_WITH_AES_128_CBC_SHA"
};

String[] availableCiphers = null;

try
{
SSLSocketFactory factory = m_ctx.getSocketFactory();
availableCiphers = factory.getSupportedCipherSuites();
Arrays.sort(availableCiphers);
}
catch(Exception e)
{
return new String[] {
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
"TLS_DHE_DSS_WITH_AES_256_CBC_SHA",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_RSA_WITH_AES_256_CBC_SHA256",
"TLS_RSA_WITH_AES_256_CBC_SHA",
"TLS_RSA_WITH_AES_128_CBC_SHA256",
"TLS_RSA_WITH_AES_128_CBC_SHA",
"TLS_EMPTY_RENEGOTIATION_INFO_SCSV"
};
}

List<String> aa = new ArrayList<String>();
for(int i = 0; i < preferredCiphers.length; i++)
{
int idx = Arrays.binarySearch(availableCiphers, preferredCiphers[i]);
if(idx >= 0)
aa.add(preferredCiphers[i]);
}

aa.add("TLS_EMPTY_RENEGOTIATION_INFO_SCSV");

return aa.toArray(new String[0]);
}

private SSLContext m_ctx;

private String[] m_ciphers;
private String[] m_protocols;
}

编辑:我尝试在相关方法之前使用@override:

@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException
{
SSLSocketFactory factory = m_ctx.getSocketFactory();
SSLSocket ss = (SSLSocket)factory.createSocket(s, host, port, autoClose);

ss.setEnabledProtocols(m_protocols);
ss.setEnabledCipherSuites(m_ciphers);

return ss;
}

什么都没有改变,问题依然存在。

另外,请注意,在代码的末尾,有这一部分:

@Override
public Socket createSocket(Socket arg0, String arg1, int arg2, boolean arg3)
throws IOException {
// TODO Auto-generated method stub
return null;
}

当我评论该方法时错误消失了。SSLFactory 是在类中构建的。我怎样才能重新访问它以检查它的代码?

最佳答案

您的问题似乎是 createSocket(Socket, String, int, boolean)已经存在于您正在扩展的父类(super class)中 ( SSLSocketFactory)。

在 Java 中扩展一个类时,该父类(super class)中的方法成为子类中的方法(除非方法的 scope does not allow it )。因此,当您添加 createSocket(Socket, String, int, boolean)子类的方法 eclipse 认为您正在尝试定义一个与父类(super class)方法具有相同签名的新方法。尝试添加 @Override您的方法版本上方的注释。

或者因为父类(super class)已经实现了那个方法,你可以删除你的实现并且仍然能够调用 createSocket(Socket, String, int, boolean)通过你的SSLSocketFactoryEx类。

编辑:鉴于您提供的信息,我需要修改此答案。对您来说,不仅仅是您试图重写一个 super 方法,而是 super 方法已经在您的类中被重写了。如果您需要保留方法的功能(即 SSLSocketFactorycreateSocket(Socket, String, int, boolean) 实现不足以满足您的需求),则必须删除其他重写方法。每个子类重写只能工作一次,所以你不能重写同一个方法两次。因此,只需删除一个 Overridden 方法并将您的代码插入另一个方法,这样您的类中就只有一个实现。

请记住,Java 确实 允许具有不同参数的同名方法。 但是只是重命名参数并不算作不同的参数。您类(class)中的这两种方法都具有相同的签名 createSocket(Socket, String, int, boolean)无论参数名称如何。

关于Java不接受同名的2个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30660285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com